Add .ifNotNull extension function as a more readable alternative to ?.let

This commit is contained in:
tzugen 2021-11-09 22:20:41 +01:00
parent 8830d76497
commit bb36116d70
No known key found for this signature in database
GPG Key ID: 61E9C34BC10EC930
8 changed files with 29 additions and 21 deletions

View File

@ -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
)

View File

@ -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<APIShare>.toDomainEntitiesList(): List<Share> = 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(),

View File

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

View File

@ -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)

View File

@ -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)

View File

@ -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 {

View File

@ -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())
}

View File

@ -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 : Any, R> T?.ifNotNull(block: (T) -> R): R? {
return this?.let(block)
}
data class NetworkInfo(
var connected: Boolean = false,
var unmetered: Boolean = false