mirror of
https://github.com/clangen/musikcube.git
synced 2024-10-02 04:52:32 +00:00
Updated Android app to use the latest tooling. Also updated dependencies
and cleaned up a few warnings.
This commit is contained in:
parent
f538ff34eb
commit
2df1dc8fd9
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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() {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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, "")
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user