From bb36116d70c07e0fc40db3a20d90abb17ee30729 Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 9 Nov 2021 22:20:41 +0100 Subject: [PATCH] Add .ifNotNull extension function as a more readable alternative to ?.let --- .../ultrasonic/domain/APIPlaylistConverter.kt | 3 ++- .../ultrasonic/domain/APIShareConverter.kt | 7 ++++--- .../fragment/TrackCollectionFragment.kt | 2 +- .../service/CommunicationErrorHandler.kt | 4 +++- .../service/MediaPlayerLifecycleSupport.kt | 3 ++- .../moire/ultrasonic/subsonic/ShareHandler.kt | 3 ++- .../ultrasonic/util/MediaSessionHandler.kt | 19 +++++++------------ .../kotlin/org/moire/ultrasonic/util/Util.kt | 9 ++++++++- 8 files changed, 29 insertions(+), 21 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverter.kt index 7699acf3..57f7e29d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIPlaylistConverter.kt @@ -6,6 +6,7 @@ package org.moire.ultrasonic.domain import java.text.SimpleDateFormat import kotlin.LazyThreadSafetyMode.NONE import org.moire.ultrasonic.api.subsonic.models.Playlist as APIPlaylist +import org.moire.ultrasonic.util.Util.ifNotNull internal val playlistDateFormat by lazy(NONE) { SimpleDateFormat.getInstance() } @@ -17,7 +18,7 @@ fun APIPlaylist.toMusicDirectoryDomainEntity(): MusicDirectory = MusicDirectory( fun APIPlaylist.toDomainEntity(): Playlist = Playlist( this.id, this.name, this.owner, this.comment, this.songCount.toString(), - this.created?.let { playlistDateFormat.format(it.time) } ?: "", + this.created.ifNotNull { playlistDateFormat.format(it.time) } ?: "", public ) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIShareConverter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIShareConverter.kt index 36486783..408f42f7 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIShareConverter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/domain/APIShareConverter.kt @@ -5,6 +5,7 @@ package org.moire.ultrasonic.domain import java.text.SimpleDateFormat import kotlin.LazyThreadSafetyMode.NONE import org.moire.ultrasonic.api.subsonic.models.Share as APIShare +import org.moire.ultrasonic.util.Util.ifNotNull internal val shareTimeFormat by lazy(NONE) { SimpleDateFormat.getInstance() } @@ -13,11 +14,11 @@ fun List.toDomainEntitiesList(): List = this.map { } fun APIShare.toDomainEntity(): Share = Share( - created = this@toDomainEntity.created?.let { shareTimeFormat.format(it.time) }, + created = this@toDomainEntity.created.ifNotNull { shareTimeFormat.format(it.time) }, description = this@toDomainEntity.description, - expires = this@toDomainEntity.expires?.let { shareTimeFormat.format(it.time) }, + expires = this@toDomainEntity.expires.ifNotNull { shareTimeFormat.format(it.time) }, id = this@toDomainEntity.id, - lastVisited = this@toDomainEntity.lastVisited?.let { shareTimeFormat.format(it.time) }, + lastVisited = this@toDomainEntity.lastVisited.ifNotNull { shareTimeFormat.format(it.time) }, url = this@toDomainEntity.url, username = this@toDomainEntity.username, visitCount = this@toDomainEntity.visitCount.toLong(), diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index c6681559..9d785a30 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -211,7 +211,7 @@ class TrackCollectionFragment : Fragment() { val handler = CoroutineExceptionHandler { _, exception -> Handler(Looper.getMainLooper()).post { - context?.let { CommunicationErrorHandler.handleError(exception, it) } + CommunicationErrorHandler.handleError(exception, context) } refreshAlbumListView!!.isRefreshing = false } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CommunicationErrorHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CommunicationErrorHandler.kt index 1b876fb5..bfda4aab 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CommunicationErrorHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CommunicationErrorHandler.kt @@ -39,9 +39,11 @@ import timber.log.Timber */ class CommunicationErrorHandler { companion object { - fun handleError(error: Throwable?, context: Context) { + fun handleError(error: Throwable?, context: Context?) { Timber.w(error) + if (context == null) return + AlertDialog.Builder(context) .setIcon(android.R.drawable.ic_dialog_alert) .setTitle(R.string.error_label) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.kt index d52927a4..379b6d60 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerLifecycleSupport.kt @@ -22,6 +22,7 @@ import org.moire.ultrasonic.domain.PlayerState import org.moire.ultrasonic.util.CacheCleaner import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Settings +import org.moire.ultrasonic.util.Util.ifNotNull import timber.log.Timber /** @@ -113,7 +114,7 @@ class MediaPlayerLifecycleSupport : KoinComponent { if (intentAction == Constants.CMD_PROCESS_KEYCODE) { if (intent.extras != null) { val event = intent.extras!![Intent.EXTRA_KEY_EVENT] as KeyEvent? - event?.let { handleKeyEvent(it) } + event.ifNotNull { handleKeyEvent(it) } } } else { handleUltrasonicIntent(intentAction) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ShareHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ShareHandler.kt index 883aeeac..13f9922f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ShareHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ShareHandler.kt @@ -26,6 +26,7 @@ import org.moire.ultrasonic.util.Settings import org.moire.ultrasonic.util.ShareDetails import org.moire.ultrasonic.util.TimeSpan import org.moire.ultrasonic.util.TimeSpanPicker +import org.moire.ultrasonic.util.Util.ifNotNull /** * This class handles sharing items in the media library @@ -79,7 +80,7 @@ class ShareHandler(val context: Context) { if (!shareDetails.ShareOnServer && shareDetails.Entries.size == 1) return null if (shareDetails.Entries.isEmpty()) { - fragment.arguments?.getString(Constants.INTENT_EXTRA_NAME_ID)?.let { + fragment.arguments?.getString(Constants.INTENT_EXTRA_NAME_ID).ifNotNull { ids.add(it) } } else { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt index 4768f6eb..f7bdf220 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/MediaSessionHandler.kt @@ -28,6 +28,7 @@ import org.moire.ultrasonic.receiver.MediaButtonIntentReceiver import org.moire.ultrasonic.service.DownloadFile import org.moire.ultrasonic.service.RxBus import org.moire.ultrasonic.service.plusAssign +import org.moire.ultrasonic.util.Util.ifNotNull import timber.log.Timber private const val INTENT_CODE_MEDIA_BUTTON = 161 @@ -150,7 +151,7 @@ class MediaSessionHandler : KoinComponent { // This probably won't be necessary once we implement more // of the modern media APIs, like the MediaController etc. val event = mediaButtonEvent.extras!!["android.intent.extra.KEY_EVENT"] as KeyEvent? - event?.let { RxBus.mediaButtonEventPublisher.onNext(it) } + event.ifNotNull { RxBus.mediaButtonEventPublisher.onNext(it) } return true } @@ -257,13 +258,10 @@ class MediaSessionHandler : KoinComponent { val index = cachedPlaylist?.indexOf(currentPlaying) cachedPlayingIndex = if (index == null || index < 0) null else index.toLong() - cachedPlaylist?.let { setMediaSessionQueue(it) } + cachedPlaylist.ifNotNull { setMediaSessionQueue(it) } - if ( - cachedPlayingIndex != null && cachedPlaylist != null && - !Settings.shouldDisableNowPlayingListSending - ) - cachedPlayingIndex?.let { playbackStateBuilder.setActiveQueueItemId(it) } + if (cachedPlaylist != null && !Settings.shouldDisableNowPlayingListSending) + cachedPlayingIndex.ifNotNull { playbackStateBuilder.setActiveQueueItemId(it) } // Save the playback state mediaSession?.setPlaybackState(playbackStateBuilder.build()) @@ -296,11 +294,8 @@ class MediaSessionHandler : KoinComponent { playbackStateBuilder.setState(playbackState!!, cachedPosition, 1.0f) playbackStateBuilder.setActions(playbackActions!!) - if ( - cachedPlayingIndex != null && cachedPlaylist != null && - !Settings.shouldDisableNowPlayingListSending - ) - playbackStateBuilder.setActiveQueueItemId(cachedPlayingIndex!!) + if (cachedPlaylist != null && !Settings.shouldDisableNowPlayingListSending) + cachedPlayingIndex.ifNotNull { playbackStateBuilder.setActiveQueueItemId(it) } mediaSession?.setPlaybackState(playbackStateBuilder.build()) } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt index 26ae9369..1d4b4b7f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Util.kt @@ -538,7 +538,6 @@ object Util { } /** - * * Broadcasts the given song info as the new song being played. */ fun broadcastNewTrackInfo(context: Context, song: MusicDirectory.Entry?) { @@ -957,6 +956,14 @@ object Util { return context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager } + /** + * Executes the given block if this is not null. + * @return: the return of the block, or null if this is null + */ + fun T?.ifNotNull(block: (T) -> R): R? { + return this?.let(block) + } + data class NetworkInfo( var connected: Boolean = false, var unmetered: Boolean = false