From e8baea61954e7e6fd9c58df7df13fd23377442e3 Mon Sep 17 00:00:00 2001 From: tzugen Date: Thu, 26 Aug 2021 22:57:10 +0200 Subject: [PATCH] Convert MainFragment to Kotlin --- detekt-baseline.xml | 4 - .../moire/ultrasonic/fragment/MainFragment.kt | 468 +++++++++--------- 2 files changed, 245 insertions(+), 227 deletions(-) diff --git a/detekt-baseline.xml b/detekt-baseline.xml index 8c94cff6..a85a67ab 100644 --- a/detekt-baseline.xml +++ b/detekt-baseline.xml @@ -30,7 +30,6 @@ LongMethod:EditServerFragment.kt$EditServerFragment$override fun onViewCreated(view: View, savedInstanceState: Bundle?) LongMethod:FilePickerAdapter.kt$FilePickerAdapter$private fun fileLister(currentDirectory: File) LongMethod:LocalMediaPlayer.kt$LocalMediaPlayer$@Synchronized private fun doPlay(downloadFile: DownloadFile, position: Int, start: Boolean) - LongMethod:MediaPlayerService.kt$MediaPlayerService$private fun updateMediaSession(currentPlaying: DownloadFile?, playerState: PlayerState) LongMethod:NavigationActivity.kt$NavigationActivity$override fun onCreate(savedInstanceState: Bundle?) LongMethod:ShareHandler.kt$ShareHandler$private fun showDialog( fragment: Fragment, shareDetails: ShareDetails, swipe: SwipeRefreshLayout?, cancellationToken: CancellationToken ) LongMethod:SongView.kt$SongView$fun setSong(song: MusicDirectory.Entry, checkable: Boolean, draggable: Boolean) @@ -49,7 +48,6 @@ 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$256 MagicNumber:MediaPlayerService.kt$MediaPlayerService$3 MagicNumber:MediaPlayerService.kt$MediaPlayerService$4 @@ -70,11 +68,9 @@ 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:SongView.kt$SongView$e: Exception TooGenericExceptionCaught:SubsonicUncaughtExceptionHandler.kt$SubsonicUncaughtExceptionHandler$x: Throwable 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:TrackCollectionFragment.kt$TrackCollectionFragment : Fragment diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/MainFragment.kt b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/MainFragment.kt index 9254a912..3f827d94 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/MainFragment.kt +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/MainFragment.kt @@ -1,272 +1,294 @@ -package org.moire.ultrasonic.fragment; +package org.moire.ultrasonic.fragment -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ListView; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.navigation.Navigation; - -import org.moire.ultrasonic.R; -import org.moire.ultrasonic.data.ActiveServerProvider; -import org.moire.ultrasonic.data.ServerSetting; -import org.moire.ultrasonic.util.Constants; -import org.moire.ultrasonic.util.MergeAdapter; -import org.moire.ultrasonic.util.Util; - -import java.util.Collections; - -import kotlin.Lazy; - -import static java.util.Arrays.asList; -import static org.koin.java.KoinJavaComponent.inject; +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.AdapterView.OnItemClickListener +import android.widget.ListView +import android.widget.TextView +import androidx.fragment.app.Fragment +import androidx.navigation.Navigation +import java.util.Locale +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject +import org.moire.ultrasonic.R +import org.moire.ultrasonic.data.ActiveServerProvider +import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline +import org.moire.ultrasonic.util.Constants +import org.moire.ultrasonic.util.MergeAdapter +import org.moire.ultrasonic.util.Util.applyTheme +import org.moire.ultrasonic.util.Util.getMaxAlbums +import org.moire.ultrasonic.util.Util.getMaxSongs +import org.moire.ultrasonic.util.Util.getShouldUseId3Tags /** * Displays the Main screen of Ultrasonic, where the music library can be browsed */ -public class MainFragment extends Fragment { +class MainFragment : Fragment(), KoinComponent { + private var list: ListView? = null - private static boolean shouldUseId3; - private static String lastActiveServerProperties; + private lateinit var serverButton: View + private lateinit var serverTextView: TextView + private lateinit var musicTitle: View + private lateinit var artistsButton: View + private lateinit var albumsButton: View + private lateinit var genresButton: View + private lateinit var videosTitle: View + private lateinit var songsTitle: View + private lateinit var randomSongsButton: View + private lateinit var songsStarredButton: View + private lateinit var albumsTitle: View + private lateinit var albumsNewestButton: View + private lateinit var albumsRandomButton: View + private lateinit var albumsHighestButton: View + private lateinit var albumsStarredButton: View + private lateinit var albumsRecentButton: View + private lateinit var albumsFrequentButton: View + private lateinit var albumsAlphaByNameButton: View + private lateinit var albumsAlphaByArtistButton: View + private lateinit var videosButton: View - private ListView list; + private val activeServerProvider: ActiveServerProvider by inject() - private final Lazy activeServerProvider = inject(ActiveServerProvider.class); - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - Util.applyTheme(this.getContext()); - super.onCreate(savedInstanceState); + override fun onCreate(savedInstanceState: Bundle?) { + applyTheme(this.context) + super.onCreate(savedInstanceState) } - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - return inflater.inflate(R.layout.main, container, false); + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return inflater.inflate(R.layout.main, container, false) } - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + list = view.findViewById(R.id.main_list) + cachedActiveServerProperties = getActiveServerProperties() - list = view.findViewById(R.id.main_list); - setupMenuList(list); + setupButtons() - super.onViewCreated(view, savedInstanceState); + if (list != null) setupMenuList(list!!) + + super.onViewCreated(view, savedInstanceState) } - @Override - public void onResume() { - super.onResume(); - boolean shouldRestart = false; + override fun onResume() { + super.onResume() + var shouldRestart = false + val currentId3Setting = getShouldUseId3Tags() + val currentActiveServerProperties = getActiveServerProperties() - boolean id3 = Util.getShouldUseId3Tags(); - String currentActiveServerProperties = getActiveServerProperties(); - - if (id3 != shouldUseId3) - { - shouldUseId3 = id3; - shouldRestart = true; + // If setting has changed... + if (currentId3Setting != shouldUseId3) { + shouldUseId3 = currentId3Setting + shouldRestart = true } - if (!currentActiveServerProperties.equals(lastActiveServerProperties)) - { - lastActiveServerProperties = currentActiveServerProperties; - shouldRestart = true; + // or the server has changed... + if (currentActiveServerProperties != cachedActiveServerProperties) { + cachedActiveServerProperties = currentActiveServerProperties + shouldRestart = true } + // then setup the list anew. if (shouldRestart) { - setupMenuList(list); + if (list != null) setupMenuList(list!!) } } - private void setupMenuList(ListView list) - { - final View buttons = getLayoutInflater().inflate(R.layout.main_buttons, list, false); - final View serverButton = buttons.findViewById(R.id.main_select_server); - final TextView serverTextView = serverButton.findViewById(R.id.main_select_server_2); + private fun setupButtons() { + val buttons = layoutInflater.inflate(R.layout.main_buttons, list, false) + serverButton = buttons.findViewById(R.id.main_select_server) + serverTextView = serverButton.findViewById(R.id.main_select_server_2) + musicTitle = buttons.findViewById(R.id.main_music) + artistsButton = buttons.findViewById(R.id.main_artists_button) + albumsButton = buttons.findViewById(R.id.main_albums_button) + genresButton = buttons.findViewById(R.id.main_genres_button) + videosTitle = buttons.findViewById(R.id.main_videos_title) + songsTitle = buttons.findViewById(R.id.main_songs) + randomSongsButton = buttons.findViewById(R.id.main_songs_button) + songsStarredButton = buttons.findViewById(R.id.main_songs_starred) + albumsTitle = buttons.findViewById(R.id.main_albums) + albumsNewestButton = buttons.findViewById(R.id.main_albums_newest) + albumsRandomButton = buttons.findViewById(R.id.main_albums_random) + albumsHighestButton = buttons.findViewById(R.id.main_albums_highest) + albumsStarredButton = buttons.findViewById(R.id.main_albums_starred) + albumsRecentButton = buttons.findViewById(R.id.main_albums_recent) + albumsFrequentButton = buttons.findViewById(R.id.main_albums_frequent) + albumsAlphaByNameButton = buttons.findViewById(R.id.main_albums_alphaByName) + albumsAlphaByArtistButton = buttons.findViewById(R.id.main_albums_alphaByArtist) + videosButton = buttons.findViewById(R.id.main_videos) + } - lastActiveServerProperties = getActiveServerProperties(); - String name = activeServerProvider.getValue().getActiveServer().getName(); + private fun setupMenuList(list: ListView) { + // Set title + val activeServerName = activeServerProvider.getActiveServer().name + serverTextView.text = activeServerName - serverTextView.setText(name); + // TODO: Should use RecyclerView + val adapter = MergeAdapter() - final View musicTitle = buttons.findViewById(R.id.main_music); - final View artistsButton = buttons.findViewById(R.id.main_artists_button); - final View albumsButton = buttons.findViewById(R.id.main_albums_button); - final View genresButton = buttons.findViewById(R.id.main_genres_button); - final View videosTitle = buttons.findViewById(R.id.main_videos_title); - final View songsTitle = buttons.findViewById(R.id.main_songs); - final View randomSongsButton = buttons.findViewById(R.id.main_songs_button); - final View songsStarredButton = buttons.findViewById(R.id.main_songs_starred); - final View albumsTitle = buttons.findViewById(R.id.main_albums); - final View albumsNewestButton = buttons.findViewById(R.id.main_albums_newest); - final View albumsRandomButton = buttons.findViewById(R.id.main_albums_random); - final View albumsHighestButton = buttons.findViewById(R.id.main_albums_highest); - final View albumsStarredButton = buttons.findViewById(R.id.main_albums_starred); - final View albumsRecentButton = buttons.findViewById(R.id.main_albums_recent); - final View albumsFrequentButton = buttons.findViewById(R.id.main_albums_frequent); - final View albumsAlphaByNameButton = buttons.findViewById(R.id.main_albums_alphaByName); - final View albumsAlphaByArtistButton = buttons.findViewById(R.id.main_albums_alphaByArtist); - final View videosButton = buttons.findViewById(R.id.main_videos); + adapter.addView(serverButton, true) - final MergeAdapter adapter = new MergeAdapter(); - adapter.addViews(Collections.singletonList(serverButton), true); + shouldUseId3 = getShouldUseId3Tags() - shouldUseId3 = Util.getShouldUseId3Tags(); - - if (!ActiveServerProvider.Companion.isOffline()) - { - adapter.addView(musicTitle, false); - adapter.addViews(asList(artistsButton, albumsButton, genresButton), true); - - adapter.addView(songsTitle, false); - adapter.addViews(asList(randomSongsButton, songsStarredButton), true); - - adapter.addView(albumsTitle, false); - adapter.addViews(asList(albumsNewestButton, albumsRecentButton, albumsFrequentButton), true); - if (!shouldUseId3) - adapter.addView(albumsHighestButton, true); - adapter.addViews(asList(albumsRandomButton, albumsStarredButton, albumsAlphaByNameButton, albumsAlphaByArtistButton), true); - - adapter.addView(videosTitle, false); - adapter.addViews(Collections.singletonList(videosButton), true); - } - else // Offline supported calls - { - adapter.addView(musicTitle, false); - adapter.addViews(asList(artistsButton, genresButton), true); - - adapter.addView(songsTitle, false); - adapter.addView(randomSongsButton, true); - - adapter.addView(videosTitle, false); - adapter.addViews(Collections.singletonList(videosButton), true); + if (!isOffline()) { + adapter.addView(musicTitle, false) + adapter.addViews(listOf(artistsButton, albumsButton, genresButton), true) + adapter.addView(songsTitle, false) + adapter.addViews(listOf(randomSongsButton, songsStarredButton), true) + adapter.addView(albumsTitle, false) + adapter.addViews( + listOf( + albumsNewestButton, + albumsRecentButton, + albumsFrequentButton + ), + true + ) + if (!shouldUseId3) { + adapter.addView(albumsHighestButton, true) + } + adapter.addViews( + listOf( + albumsRandomButton, + albumsStarredButton, + albumsAlphaByNameButton, + albumsAlphaByArtistButton + ), + true + ) + adapter.addView(videosTitle, false) + adapter.addViews(listOf(videosButton), true) + } else { + // Offline supported calls + adapter.addView(musicTitle, false) + adapter.addViews(listOf(artistsButton, genresButton), true) + adapter.addView(songsTitle, false) + adapter.addView(randomSongsButton, true) } - list.setAdapter(adapter); - list.setOnItemClickListener((parent, view, position, id) -> { - if (view == serverButton) - { - showServers(); - } - else if (view == albumsNewestButton) - { - showAlbumList("newest", R.string.main_albums_newest); - } - else if (view == albumsRandomButton) - { - showAlbumList("random", R.string.main_albums_random); - } - else if (view == albumsHighestButton) - { - showAlbumList("highest", R.string.main_albums_highest); - } - else if (view == albumsRecentButton) - { - showAlbumList("recent", R.string.main_albums_recent); - } - else if (view == albumsFrequentButton) - { - showAlbumList("frequent", R.string.main_albums_frequent); - } - else if (view == albumsStarredButton) - { - showAlbumList(Constants.STARRED, R.string.main_albums_starred); - } - else if (view == albumsAlphaByNameButton) - { - showAlbumList(Constants.ALPHABETICAL_BY_NAME, R.string.main_albums_alphaByName); - } - else if (view == albumsAlphaByArtistButton) - { - showAlbumList("alphabeticalByArtist", R.string.main_albums_alphaByArtist); - } - else if (view == songsStarredButton) - { - showStarredSongs(); - } - else if (view == artistsButton) - { - showArtists(); - } - else if (view == albumsButton) - { - showAlbumList(Constants.ALPHABETICAL_BY_NAME, R.string.main_albums_title); - } - else if (view == randomSongsButton) - { - showRandomSongs(); - } - else if (view == genresButton) - { - showGenres(); - } - else if (view == videosButton) - { - showVideos(); - } - }); + list.adapter = adapter + list.onItemClickListener = listListener } - private String getActiveServerProperties() - { - ServerSetting currentSetting = activeServerProvider.getValue().getActiveServer(); - return String.format("%s;%s;%s;%s;%s;%s", currentSetting.getUrl(), currentSetting.getUserName(), - currentSetting.getPassword(), currentSetting.getAllowSelfSignedCertificate(), - currentSetting.getLdapSupport(), currentSetting.getMinimumApiVersion()); + private val listListener = + OnItemClickListener { _: AdapterView<*>?, view: View, _: Int, _: Long -> + when { + view === serverButton -> { + showServers() + } + view === albumsNewestButton -> { + showAlbumList("newest", R.string.main_albums_newest) + } + view === albumsRandomButton -> { + showAlbumList("random", R.string.main_albums_random) + } + view === albumsHighestButton -> { + showAlbumList("highest", R.string.main_albums_highest) + } + view === albumsRecentButton -> { + showAlbumList("recent", R.string.main_albums_recent) + } + view === albumsFrequentButton -> { + showAlbumList("frequent", R.string.main_albums_frequent) + } + view === albumsStarredButton -> { + showAlbumList(Constants.STARRED, R.string.main_albums_starred) + } + view === albumsAlphaByNameButton -> { + showAlbumList(Constants.ALPHABETICAL_BY_NAME, R.string.main_albums_alphaByName) + } + view === albumsAlphaByArtistButton -> { + showAlbumList("alphabeticalByArtist", R.string.main_albums_alphaByArtist) + } + view === songsStarredButton -> { + showStarredSongs() + } + view === artistsButton -> { + showArtists() + } + view === albumsButton -> { + showAlbumList(Constants.ALPHABETICAL_BY_NAME, R.string.main_albums_title) + } + view === randomSongsButton -> { + showRandomSongs() + } + view === genresButton -> { + showGenres() + } + view === videosButton -> { + showVideos() + } + } + } + + private fun getActiveServerProperties(): String { + val server = activeServerProvider.getActiveServer() + return String.format( + Locale.ROOT, + "%s;%s;%s;%s;%s;%s", + server.url, + server.userName, + server.password, + server.allowSelfSignedCertificate, + server.ldapSupport, + server.minimumApiVersion + ) } - private void showStarredSongs() - { - Bundle bundle = new Bundle(); - bundle.putInt(Constants.INTENT_EXTRA_NAME_STARRED, 1); - Navigation.findNavController(getView()).navigate(R.id.mainToTrackCollection, bundle); + private fun showStarredSongs() { + val bundle = Bundle() + bundle.putInt(Constants.INTENT_EXTRA_NAME_STARRED, 1) + Navigation.findNavController(requireView()).navigate(R.id.mainToTrackCollection, bundle) } - private void showRandomSongs() - { - Bundle bundle = new Bundle(); - bundle.putInt(Constants.INTENT_EXTRA_NAME_RANDOM, 1); - bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxSongs()); - Navigation.findNavController(getView()).navigate(R.id.mainToTrackCollection, bundle); + private fun showRandomSongs() { + val bundle = Bundle() + bundle.putInt(Constants.INTENT_EXTRA_NAME_RANDOM, 1) + bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, getMaxSongs()) + Navigation.findNavController(requireView()).navigate(R.id.mainToTrackCollection, bundle) } - private void showArtists() - { - Bundle bundle = new Bundle(); - bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, getContext().getResources().getString(R.string.main_artists_title)); - Navigation.findNavController(getView()).navigate(R.id.mainToArtistList, bundle); + private fun showArtists() { + val bundle = Bundle() + bundle.putString( + Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, + requireContext().resources.getString(R.string.main_artists_title) + ) + Navigation.findNavController(requireView()).navigate(R.id.mainToArtistList, bundle) } - private void showAlbumList(final String type, final int titleIndex) { - Bundle bundle = new Bundle(); - String title = getContext().getResources().getString(titleIndex, ""); - bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type); - bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title); - bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, Util.getMaxAlbums()); - bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0); - Navigation.findNavController(getView()).navigate(R.id.mainToAlbumList, bundle); + private fun showAlbumList(type: String, titleIndex: Int) { + val bundle = Bundle() + val title = requireContext().resources.getString(titleIndex, "") + bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TYPE, type) + bundle.putString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE, title) + bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_SIZE, getMaxAlbums()) + bundle.putInt(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_OFFSET, 0) + Navigation.findNavController(requireView()).navigate(R.id.mainToAlbumList, bundle) } - private void showGenres() - { - Navigation.findNavController(getView()).navigate(R.id.mainToSelectGenre); + private fun showGenres() { + Navigation.findNavController(requireView()).navigate(R.id.mainToSelectGenre) } - private void showVideos() - { - Bundle bundle = new Bundle(); - bundle.putInt(Constants.INTENT_EXTRA_NAME_VIDEOS, 1); - Navigation.findNavController(getView()).navigate(R.id.mainToTrackCollection, bundle); + private fun showVideos() { + val bundle = Bundle() + bundle.putInt(Constants.INTENT_EXTRA_NAME_VIDEOS, 1) + Navigation.findNavController(requireView()).navigate(R.id.mainToTrackCollection, bundle) } - private void showServers() - { - Navigation.findNavController(getView()).navigate(R.id.mainToServerSelector); + private fun showServers() { + Navigation.findNavController(requireView()).navigate(R.id.mainToServerSelector) } -} + + companion object { + private var shouldUseId3 = false + private var cachedActiveServerProperties: String? = null + } +}