Updated Android app to use the latest tooling. Also updated dependencies

and cleaned up a few warnings.
This commit is contained in:
casey langen 2018-12-09 00:17:27 -08:00
parent f538ff34eb
commit 2df1dc8fd9
9 changed files with 68 additions and 76 deletions

View File

@ -70,34 +70,35 @@ dependencies {
implementation(name:'videocache-2.8.0-clangen-5', ext:'aar')
implementation 'org.slf4j:slf4j-android:1.7.21'
implementation "android.arch.persistence.room:runtime:1.1.0"
kapt "android.arch.persistence.room:compiler:1.1.0"
implementation "android.arch.persistence.room:runtime:1.1.1"
kapt "android.arch.persistence.room:compiler:1.1.1"
implementation "android.arch.lifecycle:runtime:1.1.1"
implementation "android.arch.lifecycle:extensions:1.1.1"
kapt "android.arch.lifecycle:compiler:1.1.1"
compileOnly 'org.glassfish:javax.annotation:10.0-b28'
implementation 'com.google.dagger:dagger:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
implementation 'com.google.dagger:dagger:2.19'
kapt 'com.google.dagger:dagger-compiler:2.19'
implementation 'com.neovisionaries:nv-websocket-client:1.31'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation 'com.github.bumptech.glide:glide:4.3.1'
implementation "com.github.bumptech.glide:okhttp3-integration:4.3.1"
kapt 'com.github.bumptech.glide:compiler:4.3.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.6'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxkotlin:2.1.0'
implementation 'com.google.android.exoplayer:exoplayer:2.7.0'
implementation 'com.google.android.exoplayer:extension-okhttp:2.7.0'
implementation 'com.simplecityapps:recyclerview-fastscroll:1.0.16'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.github.bumptech.glide:glide:4.8.0'
implementation "com.github.bumptech.glide:okhttp3-integration:4.8.0"
kapt 'com.github.bumptech.glide:compiler:4.8.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.4'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
implementation 'com.google.android.exoplayer:exoplayer:2.9.2'
implementation 'com.google.android.exoplayer:extension-okhttp:2.9.2'
implementation 'com.simplecityapps:recyclerview-fastscroll:1.0.20'
implementation 'com.facebook.stetho:stetho:1.5.0'
implementation 'com.github.wooplr:Spotlight:1.2.3'
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:support-media-compat:28.0.0'
implementation('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
transitive = true

View File

@ -17,11 +17,11 @@ import io.casey.musikcube.remote.ui.shared.model.albumart.intercept as intercept
@GlideModule
class GlideModule : AppGlideModule() {
override fun registerComponents(context: Context?, glide: Glide?, registry: Registry?) {
val prefs: SharedPreferences = context!!.getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
val prefs: SharedPreferences = context.getSharedPreferences(Prefs.NAME, Context.MODE_PRIVATE)
/* intercept requests made against our server, and inject the auth token */
val client = OkHttpClient.Builder().addInterceptor({ chain ->
val client = OkHttpClient.Builder().addInterceptor { chain ->
var req = chain.request()
val serverHost = prefs.getString(Prefs.Key.ADDRESS, "")
val requestHost = req.url().host()
@ -35,9 +35,9 @@ class GlideModule : AppGlideModule() {
}
if (req != null) chain.proceed(req) else error(chain)
}).build()
}.build()
registry?.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(client))
registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(client))
}
private fun error(chain: Interceptor.Chain): Response {

View File

@ -6,10 +6,7 @@ import android.net.Uri
import com.danikula.videocache.CacheListener
import com.google.android.exoplayer2.*
import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory
import com.google.android.exoplayer2.source.DynamicConcatenatingMediaSource
import com.google.android.exoplayer2.source.ExtractorMediaSource
import com.google.android.exoplayer2.source.MediaSource
import com.google.android.exoplayer2.source.TrackGroupArray
import com.google.android.exoplayer2.source.*
import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector
import com.google.android.exoplayer2.trackselection.TrackSelectionArray
@ -128,7 +125,7 @@ class GaplessExoPlayerWrapper : PlayerWrapper() {
Preconditions.throwIfNotOnMainThread()
this.lastPosition = -1
if (gaplessPlayer?.playbackState != ExoPlayer.STATE_IDLE) {
if (gaplessPlayer?.playbackState != Player.STATE_IDLE) {
if (gaplessPlayer?.isCurrentWindowSeekable == true) {
var offset = millis.toLong()
val isInitialSeek = initialOffsetMs > 0 && (millis == initialOffsetMs)
@ -231,10 +228,10 @@ class GaplessExoPlayerWrapper : PlayerWrapper() {
override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
Preconditions.throwIfNotOnMainThread()
if (playbackState == ExoPlayer.STATE_BUFFERING) {
if (playbackState == Player.STATE_BUFFERING) {
state = State.Buffering
}
else if (playbackState == ExoPlayer.STATE_READY) {
else if (playbackState == Player.STATE_READY) {
if (dead()) {
dispose()
}
@ -260,7 +257,7 @@ class GaplessExoPlayerWrapper : PlayerWrapper() {
}
}
}
else if (playbackState == ExoPlayer.STATE_ENDED) {
else if (playbackState == Player.STATE_ENDED) {
state = State.Finished
dispose()
}
@ -304,7 +301,7 @@ class GaplessExoPlayerWrapper : PlayerWrapper() {
private val context: Context by lazy { Application.instance }
private val trackSelector = DefaultTrackSelector(AdaptiveTrackSelection.Factory(DefaultBandwidthMeter()))
private var all = mutableListOf<GaplessExoPlayerWrapper>()
private lateinit var dcms: DynamicConcatenatingMediaSource
private lateinit var dcms: ConcatenatingMediaSource
private var gaplessPlayer: SimpleExoPlayer? = null
private fun promoteNext() {
@ -327,7 +324,7 @@ class GaplessExoPlayerWrapper : PlayerWrapper() {
gaplessPlayer?.stop()
gaplessPlayer?.release()
gaplessPlayer = ExoPlayerFactory.newSimpleInstance(context, trackSelector)
dcms = DynamicConcatenatingMediaSource()
dcms = ConcatenatingMediaSource()
}
private fun removePending() {

View File

@ -119,7 +119,7 @@ class SystemService : Service() {
if (wakeLock == null) {
wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, "StreamingPlaybackService")
PowerManager.PARTIAL_WAKE_LOCK, "StreamingPlaybackService:")
wakeLock?.let {
it.setReferenceCounted(false)
@ -225,7 +225,7 @@ class SystemService : Service() {
albumArt.reset(track)
albumArt.request = originalRequest
albumArt.target = originalRequest.into(object : SimpleTarget<Bitmap>(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) {
override fun onResourceReady(bitmap: Bitmap?, transition: Transition<in Bitmap>?) {
override fun onResourceReady(bitmap: Bitmap, transition: Transition<in Bitmap>?) {
/* make sure the instance's current request is the same as this request. it's
possible we had another download request come in before this one finished */
if (albumArt.request == originalRequest) {
@ -290,7 +290,7 @@ class SystemService : Service() {
val notification = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(artist + " - " + album)
.setContentText("$artist - $album")
.setContentIntent(contentIntent)
.setUsesChronometer(false)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
@ -354,7 +354,7 @@ class SystemService : Service() {
return NotifAction.Builder(icon, title, pendingIntent).build()
}
private fun handlePlaybackAction(action: String): Boolean {
private fun handlePlaybackAction(action: String?): Boolean {
if (this.playback != null && Strings.notEmpty(action)) {
when (action) {
ACTION_NOTIFICATION_NEXT -> {
@ -389,14 +389,10 @@ class SystemService : Service() {
private val headsetHookDebouncer = object : Debouncer<Void>(HEADSET_HOOK_DEBOUNCE_MS) {
override fun onDebounced(last: Void?) {
if (headsetHookPressCount == 1) {
playback?.pauseOrResume()
}
else if (headsetHookPressCount == 2) {
playback?.next()
}
else if (headsetHookPressCount > 2) {
playback?.prev()
when (headsetHookPressCount) {
1 -> playback?.pauseOrResume()
2 -> playback?.next()
3 -> playback?.prev()
}
headsetHookPressCount = 0
}
@ -539,15 +535,15 @@ class SystemService : Service() {
}
companion object {
private val TAG = "SystemService"
private val NOTIFICATION_ID = 0xdeadbeef.toInt()
private val NOTIFICATION_CHANNEL = "musikdroid"
private val HEADSET_HOOK_DEBOUNCE_MS = 500L
private val ACTION_NOTIFICATION_PLAY = "io.casey.musikcube.remote.NOTIFICATION_PLAY"
private val ACTION_NOTIFICATION_PAUSE = "io.casey.musikcube.remote.NOTIFICATION_PAUSE"
private val ACTION_NOTIFICATION_NEXT = "io.casey.musikcube.remote.NOTIFICATION_NEXT"
private val ACTION_NOTIFICATION_PREV = "io.casey.musikcube.remote.NOTIFICATION_PREV"
val ACTION_NOTIFICATION_STOP = "io.casey.musikcube.remote.PAUSE_SHUT_DOWN"
private const val TAG = "SystemService"
private const val NOTIFICATION_ID = 0xdeadbeef.toInt()
private const val NOTIFICATION_CHANNEL = "musikdroid"
private const val HEADSET_HOOK_DEBOUNCE_MS = 500L
private const val ACTION_NOTIFICATION_PLAY = "io.casey.musikcube.remote.NOTIFICATION_PLAY"
private const val ACTION_NOTIFICATION_PAUSE = "io.casey.musikcube.remote.NOTIFICATION_PAUSE"
private const val ACTION_NOTIFICATION_NEXT = "io.casey.musikcube.remote.NOTIFICATION_NEXT"
private const val ACTION_NOTIFICATION_PREV = "io.casey.musikcube.remote.NOTIFICATION_PREV"
const val ACTION_NOTIFICATION_STOP = "io.casey.musikcube.remote.PAUSE_SHUT_DOWN"
var ACTION_WAKE_UP = "io.casey.musikcube.remote.WAKE_UP"
var ACTION_SHUT_DOWN = "io.casey.musikcube.remote.SHUT_DOWN"
var ACTION_SLEEP = "io.casey.musikcube.remote.SLEEP"
@ -555,7 +551,7 @@ class SystemService : Service() {
private val BITMAP_OPTIONS = RequestOptions().diskCacheStrategy(DiskCacheStrategy.ALL)
private val MEDIA_SESSION_ACTIONS =
private const val MEDIA_SESSION_ACTIONS =
PlaybackStateCompat.ACTION_PLAY_PAUSE or
PlaybackStateCompat.ACTION_SKIP_TO_NEXT or
PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS or

View File

@ -25,7 +25,7 @@ import io.casey.musikcube.remote.ui.shared.activity.Filterable
import io.casey.musikcube.remote.ui.shared.fragment.TransportFragment
import io.casey.musikcube.remote.util.Strings
val EXTRA_ACTIVITY_TITLE = "extra_title"
const val EXTRA_ACTIVITY_TITLE = "extra_title"
fun AppCompatActivity.setupDefaultRecyclerView(
recyclerView: RecyclerView, adapter: RecyclerView.Adapter<*>)
@ -221,7 +221,7 @@ fun fallback(input: String?, fallback: String): String =
if (input.isNullOrEmpty()) fallback else input!!
fun fallback(input: String?, fallback: Int): String =
if (input.isNullOrEmpty()) Application.Companion.instance.getString(fallback) else input!!
if (input.isNullOrEmpty()) Application.instance.getString(fallback) else input!!
fun AppCompatActivity.slideNextUp() = overridePendingTransition(R.anim.slide_up, R.anim.stay_put)

View File

@ -56,7 +56,7 @@ abstract class BaseSlidingWindow(
protected abstract fun getPageAround(index: Int)
protected fun notifyAdapterChanged() =
recyclerView.adapter.notifyDataSetChanged()
recyclerView.adapter?.notifyDataSetChanged()
protected fun notifyMetadataLoaded(offset: Int, count: Int) =
loadedListener?.onMetadataLoaded(offset, count)
@ -65,7 +65,7 @@ abstract class BaseSlidingWindow(
scrollState != RecyclerView.SCROLL_STATE_IDLE || fastScrollerActive
private val recyclerViewScrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
scrollState = newState
if (!scrolling()) {
notifyAdapterChanged()

View File

@ -110,7 +110,7 @@ class EditPlaylistActivity: BaseActivity() {
ItemTouchHelper.UP or ItemTouchHelper.DOWN,
ItemTouchHelper.LEFT)
{
override fun onMove(recyclerView: RecyclerView?, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
val from = viewHolder.adapterPosition
val to = target.adapterPosition
viewModel.move(from, to)

View File

@ -73,6 +73,7 @@ class TrackListActivity : BaseActivity(), Filterable {
setupDefaultRecyclerView(recyclerView, adapter)
emptyView = findViewById(R.id.empty_list_view)
emptyView.let {
it.capability = if (isOfflineTracks) Capability.OfflineOk else Capability.OnlineOnly
it.emptyMessage = emptyMessage
@ -82,9 +83,8 @@ class TrackListActivity : BaseActivity(), Filterable {
tracks.setOnMetadataLoadedListener(slidingWindowListener)
transport = addTransportFragment(object: TransportFragment.OnModelChangedListener {
override fun onChanged(fragment: TransportFragment) {
override fun onChanged(fragment: TransportFragment) =
adapter.notifyDataSetChanged()
}
})!!
}
@ -156,7 +156,7 @@ class TrackListActivity : BaseActivity(), Filterable {
override fun onActionItemClick(view: View, track: ITrack, position: Int) {
val mixin = mixin(ItemContextMenuMixin::class.java)!!
if (categoryType == Messages.Category.Companion.PLAYLISTS) {
if (categoryType == Messages.Category.PLAYLISTS) {
mixin.showForPlaylistTrack(track, position, categoryId, categoryValue, view)
}
else {
@ -240,9 +240,8 @@ class TrackListActivity : BaseActivity(), Filterable {
}
private val slidingWindowListener = object : ITrackListSlidingWindow.OnMetadataLoadedListener {
override fun onReloaded(count: Int) {
override fun onReloaded(count: Int) =
emptyView.update(data.provider.state, count)
}
override fun onMetadataLoaded(offset: Int, count: Int) {}
}
@ -261,11 +260,11 @@ class TrackListActivity : BaseActivity(), Filterable {
}
companion object {
private val EXTRA_CATEGORY_TYPE = "extra_category_type"
private val EXTRA_SELECTED_ID = "extra_selected_id"
private val EXTRA_TITLE_ID = "extra_title_id"
private val EXTRA_CATEGORY_VALUE = "extra_category_value"
private val REQUEST_CODE_EDIT_PLAYLIST = 72
private const val EXTRA_CATEGORY_TYPE = "extra_category_type"
private const val EXTRA_SELECTED_ID = "extra_selected_id"
private const val EXTRA_TITLE_ID = "extra_title_id"
private const val EXTRA_CATEGORY_VALUE = "extra_category_value"
private const val REQUEST_CODE_EDIT_PLAYLIST = 72
fun getStartIntent(context: Context, type: String, id: Long): Intent =
getStartIntent(context, type, id, "")

View File

@ -29,30 +29,29 @@ class TrackListAdapter(private val tracks: DefaultSlidingWindow,
val view = inflater.inflate(R.layout.simple_list_item, parent, false)
view.tag = Tag(null, null)
view.setOnClickListener({ v ->
view.setOnClickListener { v ->
val tag = v.tag as Tag
letMany(listener, tag.track, tag.position) { listener, track, pos ->
listener.onItemClick(v, track, pos)
}
})
}
view.findViewById<View>(R.id.action).setOnClickListener({ v ->
view.findViewById<View>(R.id.action).setOnClickListener { v ->
val tag = v.tag as Tag
letMany(listener, tag.track, tag.position) { listener, track, position ->
listener.onActionItemClick(v, track, position)
}
})
}
return ViewHolder(view, playback)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
override fun onBindViewHolder(holder: ViewHolder, position: Int) =
holder.bind(tracks.getTrack(position), position)
}
override fun getItemCount(): Int = tracks.count
class ViewHolder internal constructor(private val view: View,
class ViewHolder internal constructor(view: View,
private val playback: PlaybackMixin) : RecyclerView.ViewHolder(view)
{
private val title: TextView = view.findViewById(R.id.title)