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
+ }
+}