Compare commits

..

No commits in common. "3a39902c4caa0e0d92e2f263ceda76600a77ba20" and "404c7c05d55c2b7b50a70e1c6832a57d0c521d62" have entirely different histories.

11 changed files with 27 additions and 68 deletions

View File

@ -1,8 +0,0 @@
Bug fixes
- Fix more exceptions
Changes since 4.2.0
- #827: Make app full compliant Android Auto to publish in Play Store.
- #878: "Play shuffled" option for playlists always begins with the first track.
- #891: Dump config to log file when logging is enabled.
- #854: Remove Videos menu option for servers which don't support it.

View File

@ -9,7 +9,7 @@ ktlint = "0.43.2"
ktlintGradle = "11.3.1"
detekt = "1.22.0"
preferences = "1.2.0"
media3 = "1.0.1"
media3 = "1.0.0"
androidSupport = "1.6.0"
materialDesign = "1.8.0"
@ -23,8 +23,7 @@ viewModelKtx = "2.6.1"
swipeRefresh = "1.1.0"
retrofit = "2.9.0"
## KEEP ON 2.13 branch (https://github.com/FasterXML/jackson-databind/issues/3658#issuecomment-1312633064) for compatibility with API 24
jackson = "2.13.5"
jackson = "2.14.2"
okhttp = "4.10.0"
koin = "3.3.2"
picasso = "2.8"

View File

@ -9,8 +9,8 @@ android {
defaultConfig {
applicationId "org.moire.ultrasonic"
versionCode 117
versionName "4.3.4"
versionCode 116
versionName "4.3.3"
minSdkVersion versions.minSdk
targetSdkVersion versions.targetSdk

View File

@ -46,7 +46,7 @@ public class GenreAdapter extends ArrayAdapter<Genre> implements SectionIndexer
private final Object[] sections;
private final Integer[] positions;
public GenreAdapter(@NonNull Context context, List<Genre> genres)
public GenreAdapter(Context context, List<Genre> genres)
{
super(context, R.layout.list_item_generic, genres);

View File

@ -401,8 +401,6 @@ open class TrackCollectionFragment(
) {
// We are coming back from unknown context
// and need to ensure Main Thread in order to manipulate the UI
// If view is null, our view was disposed in the meantime
if (view == null) return
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main) {
val multipleSelection = viewAdapter.hasMultipleSelection()

View File

@ -102,9 +102,7 @@ class SelectGenreFragment : Fragment() {
override fun done(result: List<Genre>) {
emptyView!!.isVisible = result.isEmpty()
if (context != null) {
genreListView!!.adapter = GenreAdapter(context!!, result)
}
genreListView!!.adapter = GenreAdapter(context, result)
}
}
task.execute()

View File

@ -240,8 +240,6 @@ class ImageLoader(
} finally {
inputStream.safeClose()
}
} catch (all: Exception) {
Timber.w(all)
} finally {
cacheInProgress.remove(file)?.countDown()
}

View File

@ -7,14 +7,11 @@
package org.moire.ultrasonic.subsonic
import android.os.Handler
import android.os.Looper
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import java.util.Collections
import java.util.LinkedList
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.CoroutineExceptionHandler
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -31,7 +28,6 @@ import org.moire.ultrasonic.util.EntryByDiscAndTrackComparator
import org.moire.ultrasonic.util.InfoDialog
import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Util
import timber.log.Timber
/**
* Retrieves a list of songs and adds them to the now playing list
@ -43,16 +39,6 @@ class DownloadHandler(
) : CoroutineScope by CoroutineScope(Dispatchers.IO) {
private val maxSongs = 500
/**
* Exception Handler for Coroutines
*/
val exceptionHandler = CoroutineExceptionHandler { _, exception ->
Handler(Looper.getMainLooper()).post {
Timber.w(exception)
}
}
// TODO: Use coroutine here (with proper exception handler)
fun download(
fragment: Fragment,
append: Boolean,
@ -224,7 +210,7 @@ class DownloadHandler(
isArtist: Boolean
) {
// Launch the Job
val job = launch(exceptionHandler) {
val job = launch {
val songs: MutableList<Track> =
getTracksFromServer(isArtist, id, isDirectory, name, isShare)

View File

@ -10,9 +10,7 @@ package org.moire.ultrasonic.util
import android.app.Activity
import android.content.Context
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import java.lang.ref.WeakReference
import org.moire.ultrasonic.R
import timber.log.Timber
/*
* InfoDialog can be used to show some information to the user. Typically it cannot be cancelled,
@ -21,30 +19,24 @@ import timber.log.Timber
open class InfoDialog(
context: Context,
message: CharSequence?,
activity: Activity? = null,
private val activity: Activity? = null,
private val finishActivityOnClose: Boolean = false
) {
private val activityRef: WeakReference<Activity?> = WeakReference(activity)
open var builder: MaterialAlertDialogBuilder = Builder(activityRef.get() ?: context, message)
open var builder: MaterialAlertDialogBuilder = Builder(activity ?: context, message)
fun show() {
builder.setOnCancelListener {
if (finishActivityOnClose) {
activityRef.get()?.finish()
activity!!.finish()
}
}
builder.setPositiveButton(R.string.common_ok) { _, _ ->
if (finishActivityOnClose) {
activityRef.get()?.finish()
activity!!.finish()
}
}
// If the app was put into the background in the meantime this would fail
try {
builder.create().show()
} catch (all: Exception) {
Timber.w(all, "Failed to create dialog")
}
builder.create().show()
}
class Builder(context: Context) : MaterialAlertDialogBuilder(context) {
@ -101,6 +93,7 @@ class ConfirmationDialog(
activity: Activity? = null,
finishActivityOnClose: Boolean = false
) : InfoDialog(context, message, activity, finishActivityOnClose) {
override var builder: MaterialAlertDialogBuilder = Builder(activity ?: context, message)
class Builder(context: Context) : MaterialAlertDialogBuilder(context) {

View File

@ -273,7 +273,7 @@ class StorageFile(
}
private fun getStorageFileForParentDirectory(path: String): StorageFile? {
val parentPath = FileUtil.getParentPath(path) ?: return null
val parentPath = FileUtil.getParentPath(path)!!
if (storageFilePathDictionary.containsKey(parentPath))
return storageFilePathDictionary[parentPath]!!
if (notExistingPathDictionary.contains(parentPath)) return null

View File

@ -133,24 +133,19 @@ object Util {
@JvmStatic
@SuppressLint("ShowToast") // Invalid warning
fun toast(context: Context?, message: CharSequence?, shortDuration: Boolean) {
// If called after doing some background processing, our context might have expired!
try {
if (toast == null) {
toast = Toast.makeText(
context,
message,
if (shortDuration) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
)
toast!!.setGravity(Gravity.CENTER, 0, 0)
} else {
toast!!.setText(message)
toast!!.duration =
if (shortDuration) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
}
toast!!.show()
} catch (_: Exception) {
// Ignore
if (toast == null) {
toast = Toast.makeText(
context,
message,
if (shortDuration) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
)
toast!!.setGravity(Gravity.CENTER, 0, 0)
} else {
toast!!.setText(message)
toast!!.duration =
if (shortDuration) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
}
toast!!.show()
}
/**