Merge branch 'up' into 'develop'

Up

See merge request ultrasonic/ultrasonic!919
This commit is contained in:
birdbird 2023-03-08 17:22:50 +00:00
commit 93f2d716a0
6 changed files with 66 additions and 21 deletions

View File

@ -9,15 +9,15 @@ ktlint = "0.43.2"
ktlintGradle = "11.0.0" ktlintGradle = "11.0.0"
detekt = "1.22.0" detekt = "1.22.0"
preferences = "1.2.0" preferences = "1.2.0"
media3 = "f3e450e783" media3 = "1.0.0-rc02"
androidSupport = "1.5.0" androidSupport = "1.5.0"
materialDesign = "1.7.0" materialDesign = "1.8.0"
constraintLayout = "2.1.4" constraintLayout = "2.1.4"
multidex = "2.0.1" multidex = "2.0.1"
room = "2.5.0" room = "2.5.0"
kotlin = "1.7.22" kotlin = "1.7.22"
kotlinxCoroutines = "1.6.4-native-mt" kotlinxCoroutines = "1.6.4"
kotlinxGuava = "1.6.4" kotlinxGuava = "1.6.4"
viewModelKtx = "2.5.1" viewModelKtx = "2.5.1"
swipeRefresh = "1.1.0" swipeRefresh = "1.1.0"
@ -25,12 +25,12 @@ swipeRefresh = "1.1.0"
retrofit = "2.9.0" retrofit = "2.9.0"
jackson = "2.14.1" jackson = "2.14.1"
okhttp = "4.10.0" okhttp = "4.10.0"
koin = "3.3.2" koin = "3.3.3"
picasso = "2.8" picasso = "2.8"
junit4 = "4.13.2" junit4 = "4.13.2"
junit5 = "5.9.2" junit5 = "5.9.2"
mockito = "5.0.0" mockito = "5.1.1"
mockitoKotlin = "4.1.0" mockitoKotlin = "4.1.0"
kluent = "1.72" kluent = "1.72"
apacheCodecs = "1.15" apacheCodecs = "1.15"
@ -64,11 +64,11 @@ navigationUiKtx = { module = "androidx.navigation:navigation-ui-ktx", ve
navigationFeature = { module = "androidx.navigation:navigation-dynamic-features-fragment", version.ref = "navigation" } navigationFeature = { module = "androidx.navigation:navigation-dynamic-features-fragment", version.ref = "navigation" }
navigationSafeArgs = { module = "androidx.navigation:navigation-safe-args-gradle-plugin", version.ref = "navigation"} navigationSafeArgs = { module = "androidx.navigation:navigation-safe-args-gradle-plugin", version.ref = "navigation"}
preferences = { module = "androidx.preference:preference", version.ref = "preferences" } preferences = { module = "androidx.preference:preference", version.ref = "preferences" }
media3common = { module = "com.github.androidx.media:media3-common", version.ref = "media3" } media3common = { module = "androidx.media3:media3-common", version.ref = "media3" }
media3exoplayer = { module = "com.github.androidx.media:media3-exoplayer", version.ref = "media3" } media3exoplayer = { module = "androidx.media3:media3-exoplayer", version.ref = "media3" }
media3datasource = { module = "com.github.androidx.media:media3-datasource", version.ref = "media3" } media3datasource = { module = "androidx.media3:media3-datasource", version.ref = "media3" }
media3okhttp = { module = "com.github.androidx.media:media3-datasource-okhttp", version.ref = "media3" } media3okhttp = { module = "androidx.media3:media3-datasource-okhttp", version.ref = "media3" }
media3session = { module = "com.github.androidx.media:media3-session", version.ref = "media3" } media3session = { module = "androidx.media3:media3-session", version.ref = "media3" }
swipeRefresh = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swipeRefresh" } swipeRefresh = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swipeRefresh" }
kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlinStdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlinReflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }

View File

@ -1,5 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<issues format="6" by="lint 7.3.1" type="baseline" client="gradle" dependencies="true" name="AGP (7.3.1)" variant="all" version="7.3.1"> <issues format="6" by="lint 7.4.0" type="baseline" client="gradle" dependencies="true" name="AGP (7.4.0)" variant="all" version="7.4.0">
<issue
id="MissingPermission"
message="Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`"
errorLine1=" manager.notify(NOTIFICATION_ID, notification)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/kotlin/org/moire/ultrasonic/service/DownloadService.kt"
line="260"
column="17"/>
</issue>
<issue
id="MissingPermission"
message="Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`"
errorLine1=" notificationManagerCompat.notify(notification.notificationId, notification.notification)"
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/kotlin/org/moire/ultrasonic/service/JukeboxMediaPlayer.kt"
line="194"
column="9"/>
</issue>
<issue <issue
id="PluralsCandidate" id="PluralsCandidate"
@ -8,7 +30,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
<location <location
file="src/main/res/values/strings.xml" file="src/main/res/values/strings.xml"
line="153" line="152"
column="5"/> column="5"/>
</issue> </issue>
@ -16,14 +38,14 @@
id="TrustAllX509TrustManager" id="TrustAllX509TrustManager"
message="`checkClientTrusted` is empty, which could cause insecure network traffic due to trusting arbitrary TLS/SSL certificates presented by peers"> message="`checkClientTrusted` is empty, which could cause insecure network traffic due to trusting arbitrary TLS/SSL certificates presented by peers">
<location <location
file="org/moire/ultrasonic/api/subsonic/SubsonicAPIClient$allowSelfSignedCertificates$trustManager$1.class"/> file="../core/subsonic-api/build/libs/subsonic-api.jar"/>
</issue> </issue>
<issue <issue
id="TrustAllX509TrustManager" id="TrustAllX509TrustManager"
message="`checkServerTrusted` is empty, which could cause insecure network traffic due to trusting arbitrary TLS/SSL certificates presented by peers"> message="`checkServerTrusted` is empty, which could cause insecure network traffic due to trusting arbitrary TLS/SSL certificates presented by peers">
<location <location
file="org/moire/ultrasonic/api/subsonic/SubsonicAPIClient$allowSelfSignedCertificates$trustManager$1.class"/> file="../core/subsonic-api/build/libs/subsonic-api.jar"/>
</issue> </issue>
<issue <issue

View File

@ -186,7 +186,7 @@ class NavigationActivity : AppCompatActivity() {
// Ask for permission to send notifications // Ask for permission to send notifications
Util.ensurePermissionToPostNotification(this) Util.ensurePermissionToPostNotification(this)
RxBus.dismissNowPlayingCommandObservable.subscribe { rxBusSubscription += RxBus.dismissNowPlayingCommandObservable.subscribe {
nowPlayingHidden = true nowPlayingHidden = true
hideNowPlaying() hideNowPlaying()
} }

View File

@ -13,12 +13,14 @@ import android.view.View
import androidx.core.view.isVisible import androidx.core.view.isVisible
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import io.reactivex.rxjava3.disposables.CompositeDisposable
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
import org.moire.ultrasonic.adapters.FolderSelectorBinder import org.moire.ultrasonic.adapters.FolderSelectorBinder
import org.moire.ultrasonic.domain.Artist import org.moire.ultrasonic.domain.Artist
import org.moire.ultrasonic.domain.GenericEntry import org.moire.ultrasonic.domain.GenericEntry
import org.moire.ultrasonic.domain.Identifiable import org.moire.ultrasonic.domain.Identifiable
import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.service.plusAssign
import org.moire.ultrasonic.subsonic.DownloadHandler import org.moire.ultrasonic.subsonic.DownloadHandler
import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.Settings
@ -29,6 +31,8 @@ import org.moire.ultrasonic.util.Settings
*/ */
abstract class EntryListFragment<T : GenericEntry> : MultiListFragment<T>() { abstract class EntryListFragment<T : GenericEntry> : MultiListFragment<T>() {
private var rxBusSubscription: CompositeDisposable = CompositeDisposable()
/** /**
* Whether to show the folder selector * Whether to show the folder selector
*/ */
@ -61,7 +65,7 @@ abstract class EntryListFragment<T : GenericEntry> : MultiListFragment<T>() {
// because it can't be initialized from inside the callback // because it can't be initialized from inside the callback
serverSettingsModel.toString() serverSettingsModel.toString()
RxBus.musicFolderChangedEventObservable.subscribe { rxBusSubscription += RxBus.musicFolderChangedEventObservable.subscribe {
if (!listModel.isOffline()) { if (!listModel.isOffline()) {
val currentSetting = listModel.activeServer val currentSetting = listModel.activeServer
currentSetting.musicFolderId = it.id currentSetting.musicFolderId = it.id
@ -75,6 +79,11 @@ abstract class EntryListFragment<T : GenericEntry> : MultiListFragment<T>() {
) )
} }
override fun onDestroyView() {
super.onDestroyView()
rxBusSubscription.dispose()
}
/** /**
* What to do when the list has changed * What to do when the list has changed
*/ */

View File

@ -16,6 +16,7 @@ import androidx.media3.session.DefaultMediaNotificationProvider
import androidx.media3.session.MediaNotification import androidx.media3.session.MediaNotification
import androidx.media3.session.MediaSession import androidx.media3.session.MediaSession
import androidx.media3.session.SessionCommand import androidx.media3.session.SessionCommand
import com.google.common.collect.ImmutableList
import org.koin.core.component.KoinComponent import org.koin.core.component.KoinComponent
import org.koin.core.component.inject import org.koin.core.component.inject
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
@ -36,7 +37,7 @@ class CustomNotificationProvider(ctx: Context) :
override fun addNotificationActions( override fun addNotificationActions(
mediaSession: MediaSession, mediaSession: MediaSession,
mediaButtons: MutableList<CommandButton>, mediaButtons: ImmutableList<CommandButton>,
builder: NotificationCompat.Builder, builder: NotificationCompat.Builder,
actionFactory: MediaNotification.ActionFactory actionFactory: MediaNotification.ActionFactory
): IntArray { ): IntArray {
@ -73,18 +74,19 @@ class CustomNotificationProvider(ctx: Context) :
} }
return super.addNotificationActions( return super.addNotificationActions(
mediaSession, mediaSession,
mediaButtons + tmp, ImmutableList.copyOf((mediaButtons + tmp)),
builder, builder,
actionFactory actionFactory
) )
} }
override fun getMediaButtons( override fun getMediaButtons(
session: MediaSession,
playerCommands: Player.Commands, playerCommands: Player.Commands,
customLayout: MutableList<CommandButton>, customLayout: ImmutableList<CommandButton>,
playWhenReady: Boolean playWhenReady: Boolean
): MutableList<CommandButton> { ): ImmutableList<CommandButton> {
val commands = super.getMediaButtons(playerCommands, customLayout, playWhenReady) val commands = super.getMediaButtons(session, playerCommands, customLayout, playWhenReady)
commands.forEachIndexed { index, command -> commands.forEachIndexed { index, command ->
command.extras.putInt(COMMAND_KEY_COMPACT_VIEW_INDEX, index) command.extras.putInt(COMMAND_KEY_COMPACT_VIEW_INDEX, index)

View File

@ -2,8 +2,19 @@
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="match_parent" a:layout_width="match_parent"
a:layout_height="match_parent" a:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
a:orientation="vertical"> a:orientation="vertical">
<com.google.android.material.search.SearchView
a:layout_width="match_parent"
a:layout_height="match_parent"
a:hint="@string/search.title"
app:layout_anchor="@id/search_bar">
<!-- Search suggestions/results go here (ScrollView, RecyclerView, etc.). -->
<include layout="@layout/list_parts_empty_view" /> <include layout="@layout/list_parts_empty_view" />
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@ -19,5 +30,6 @@
a:layout_weight="1.0" /> a:layout_weight="1.0" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</com.google.android.material.search.SearchView>
</LinearLayout> </LinearLayout>