diff --git a/app/build.gradle b/app/build.gradle index 82e6c50..2830d57 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,7 +61,6 @@ dependencies { implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.github.tbruyelle:rxpermissions:0.10.2' implementation "com.github.bumptech.glide:glide:$glide_version" - implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.1' implementation 'com.drakeet.about:about:2.4.1' implementation 'com.drakeet.multitype:multitype:4.2.0' implementation 'it.sephiroth.android.library.imagezoom:imagezoom:2.3.0' diff --git a/app/src/main/kotlin/com/absinthe/kage/adapter/DeviceAdapter.kt b/app/src/main/kotlin/com/absinthe/kage/adapter/DeviceAdapter.kt deleted file mode 100644 index 34db884..0000000 --- a/app/src/main/kotlin/com/absinthe/kage/adapter/DeviceAdapter.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.absinthe.kage.adapter - -import com.absinthe.kage.R -import com.absinthe.kage.device.model.DeviceInfo -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.viewholder.BaseViewHolder - -open class DeviceAdapter : BaseQuickAdapter(R.layout.item_device) { - - override fun convert(helper: BaseViewHolder, item: DeviceInfo) { - helper.setText(R.id.tv_device_name, item.name) - helper.setText(R.id.tv_device_ip, item.ip) - - when (item.state) { - DeviceInfo.STATE_IDLE -> helper.setText(R.id.btn_connect, R.string.connect_state_connect) - DeviceInfo.STATE_CONNECTING -> helper.setText(R.id.btn_connect, R.string.connect_state_connecting) - DeviceInfo.STATE_CONNECTED -> helper.setText(R.id.btn_connect, R.string.connect_state_connected) - } - } - - init { - addChildClickViewIds(R.id.btn_connect) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/absinthe/kage/adapter/MusicListAdapter.kt b/app/src/main/kotlin/com/absinthe/kage/adapter/MusicListAdapter.kt deleted file mode 100644 index 2c48055..0000000 --- a/app/src/main/kotlin/com/absinthe/kage/adapter/MusicListAdapter.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.absinthe.kage.adapter - -import android.widget.ImageView -import com.absinthe.kage.R -import com.absinthe.kage.media.audio.LocalMusic -import com.absinthe.kage.media.audio.MusicHelper -import com.blankj.utilcode.util.ConvertUtils -import com.bumptech.glide.Glide -import com.bumptech.glide.load.resource.bitmap.RoundedCorners -import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions -import com.bumptech.glide.request.RequestOptions -import com.chad.library.adapter.base.BaseQuickAdapter -import com.chad.library.adapter.base.viewholder.BaseViewHolder - -class MusicListAdapter : BaseQuickAdapter(R.layout.item_music) { - - override fun convert(helper: BaseViewHolder, item: LocalMusic) { - helper.setText(R.id.tv_music_name, item.title) - helper.setText(R.id.tv_artist, item.artist) - val ivAlbum: ImageView = helper.getView(R.id.iv_album) - Glide.with(context) - .load(MusicHelper.getAlbumArt(item.albumId.toLong())) - .transition(DrawableTransitionOptions.withCrossFade()) - .apply(RequestOptions.bitmapTransform(RoundedCorners(ConvertUtils.dp2px(3f)))) - .placeholder(R.drawable.ic_album) - .into(ivAlbum) - } -} \ No newline at end of file diff --git a/app/src/main/kotlin/com/absinthe/kage/ui/about/AboutActivity.kt b/app/src/main/kotlin/com/absinthe/kage/ui/about/AboutActivity.kt index b34b650..a5fa051 100644 --- a/app/src/main/kotlin/com/absinthe/kage/ui/about/AboutActivity.kt +++ b/app/src/main/kotlin/com/absinthe/kage/ui/about/AboutActivity.kt @@ -26,7 +26,6 @@ class AboutActivity : AbsAboutActivity() { items.add(License("MultiType", "drakeet", License.APACHE_2, "https://github.com/drakeet/MultiType")) items.add(License("about-page", "drakeet", License.APACHE_2, "https://github.com/drakeet/about-page")) items.add(License("NanoHttpd", "NanoHttpd", "BSD-3-Clause", "https://github.com/NanoHttpd/nanohttpd")) - items.add(License("BaseRecyclerViewAdapterHelper", "CymChad", License.MIT, "https://github.com/CymChad/BaseRecyclerViewAdapterHelper")) items.add(License("Matisse", "zhihu", License.APACHE_2, "https://github.com/zhihu/Matisse")) items.add(License("ExoPlayer", "Google", License.APACHE_2, "https://github.com/google/ExoPlayer")) items.add(License("AndroidX", "Google", License.APACHE_2, "https://source.google.com")) diff --git a/app/src/main/kotlin/com/absinthe/kage/ui/connect/ConnectActivity.kt b/app/src/main/kotlin/com/absinthe/kage/ui/connect/ConnectActivity.kt index 722536f..a207918 100644 --- a/app/src/main/kotlin/com/absinthe/kage/ui/connect/ConnectActivity.kt +++ b/app/src/main/kotlin/com/absinthe/kage/ui/connect/ConnectActivity.kt @@ -2,25 +2,25 @@ package com.absinthe.kage.ui.connect import android.os.Bundle import android.view.MenuItem -import android.view.View import androidx.recyclerview.widget.LinearLayoutManager import com.absinthe.kage.BaseActivity import com.absinthe.kage.R -import com.absinthe.kage.adapter.DeviceAdapter import com.absinthe.kage.databinding.ActivityConnectBinding import com.absinthe.kage.device.DeviceManager import com.absinthe.kage.device.DeviceObserverImpl import com.absinthe.kage.device.IDeviceObserver import com.absinthe.kage.device.model.DeviceInfo import com.absinthe.kage.utils.ToastUtil.makeText -import com.chad.library.adapter.base.BaseQuickAdapter +import com.absinthe.kage.viewholder.DeviceInfoItemViewBinder +import com.drakeet.multitype.MultiTypeAdapter import timber.log.Timber class ConnectActivity : BaseActivity() { private lateinit var mBinding: ActivityConnectBinding private lateinit var mObserver: IDeviceObserver - private var mAdapter: DeviceAdapter = DeviceAdapter() + private var mAdapter = MultiTypeAdapter() + private var mItems = ArrayList() private var mDeviceManager: DeviceManager = DeviceManager override fun onCreate(savedInstanceState: Bundle?) { @@ -56,12 +56,14 @@ class ConnectActivity : BaseActivity() { mBinding.vfContainer.setInAnimation(this, R.anim.anim_fade_in) mBinding.vfContainer.setOutAnimation(this, R.anim.anim_fade_out) + mAdapter.register(DeviceInfoItemViewBinder()) mBinding.rvDevices.adapter = mAdapter mBinding.rvDevices.layoutManager = LinearLayoutManager(this) - val list = mDeviceManager.deviceInfoList - if (list.isNotEmpty()) { - mAdapter.setNewData(list as MutableList) + mItems.clear() + mItems.addAll(mDeviceManager.deviceInfoList) + if (mItems.isNotEmpty()) { + mAdapter.items = mItems switchContainer(VF_DEVICE_LIST) } @@ -73,13 +75,17 @@ class ConnectActivity : BaseActivity() { override fun onFindDevice(deviceInfo: DeviceInfo) { Timber.d("onFindDevice: $deviceInfo") - mAdapter.addData(deviceInfo) + mItems.add(deviceInfo) + mAdapter.items = mItems + mAdapter.notifyItemInserted(mAdapter.itemCount - 1) switchContainer(VF_DEVICE_LIST) } override fun onLostDevice(deviceInfo: DeviceInfo) { Timber.d("onLostDevice: $deviceInfo") - mAdapter.remove(deviceInfo) + mItems.remove(deviceInfo) + mAdapter.items = mItems + mAdapter.notifyItemRangeRemoved(0, mAdapter.itemCount - 1) if (mAdapter.itemCount == 0) { switchContainer(VF_EMPTY) } @@ -108,18 +114,6 @@ class ConnectActivity : BaseActivity() { } mDeviceManager.register(mObserver) - mAdapter.setOnItemChildClickListener { _: BaseQuickAdapter<*, *>?, view: View, position: Int -> - if (view.id == R.id.btn_connect) { - val deviceInfo = mAdapter.getItem(position) - - if (!deviceInfo.isConnected) { - mDeviceManager.onlineDevice(deviceInfo) - mDeviceManager.connectDevice(deviceInfo) - } else { - mDeviceManager.disConnectDevice() - } - } - } } private fun switchContainer(flag: Int) { diff --git a/app/src/main/kotlin/com/absinthe/kage/ui/main/MainActivity.kt b/app/src/main/kotlin/com/absinthe/kage/ui/main/MainActivity.kt index 7b0aaef..ef21d90 100644 --- a/app/src/main/kotlin/com/absinthe/kage/ui/main/MainActivity.kt +++ b/app/src/main/kotlin/com/absinthe/kage/ui/main/MainActivity.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.absinthe.kage.BaseActivity import com.absinthe.kage.R -import com.absinthe.kage.adapter.SpacesItemDecoration +import com.absinthe.kage.viewholder.SpacesItemDecoration import com.absinthe.kage.databinding.ActivityMainBinding import com.absinthe.kage.device.DeviceManager import com.absinthe.kage.device.DeviceObserverImpl diff --git a/app/src/main/kotlin/com/absinthe/kage/ui/sender/MusicListActivity.kt b/app/src/main/kotlin/com/absinthe/kage/ui/sender/MusicListActivity.kt index d8fee2f..7380367 100644 --- a/app/src/main/kotlin/com/absinthe/kage/ui/sender/MusicListActivity.kt +++ b/app/src/main/kotlin/com/absinthe/kage/ui/sender/MusicListActivity.kt @@ -1,26 +1,24 @@ package com.absinthe.kage.ui.sender -import android.content.Intent import android.os.Bundle import android.view.MenuItem -import android.view.View import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.absinthe.kage.BaseActivity -import com.absinthe.kage.adapter.MusicListAdapter import com.absinthe.kage.databinding.ActivityMusicListBinding import com.absinthe.kage.media.MusicList import com.absinthe.kage.media.audio.LocalMusic -import com.absinthe.kage.ui.media.MusicActivity +import com.absinthe.kage.viewholder.LocalMusicViewBinder import com.absinthe.kage.viewmodel.MusicViewModel -import com.chad.library.adapter.base.BaseQuickAdapter +import com.drakeet.multitype.MultiTypeAdapter class MusicListActivity : BaseActivity() { private lateinit var mBinding: ActivityMusicListBinding private lateinit var mViewModel: MusicViewModel - private var mAdapter: MusicListAdapter = MusicListAdapter() + private var mAdapter = MultiTypeAdapter() + private var mItems = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -36,27 +34,20 @@ class MusicListActivity : BaseActivity() { setSupportActionBar(mBinding.toolbar) supportActionBar?.setDisplayHomeAsUpEnabled(true) + mAdapter.register(LocalMusicViewBinder()) mBinding.rvMusicList.adapter = mAdapter mBinding.rvMusicList.layoutManager = LinearLayoutManager(this) - mAdapter.setOnItemClickListener { adapter: BaseQuickAdapter<*, *>, _: View?, position: Int -> - val localMusic = adapter.data[position] as LocalMusic? - if (localMusic != null) { - val intent = Intent(this@MusicListActivity, MusicActivity::class.java) - intent.putExtra(MusicActivity.EXTRA_MUSIC_INFO, localMusic) - intent.putExtra(MusicActivity.EXTRA_DEVICE_TYPE, MusicActivity.TYPE_SENDER) - startActivity(intent) - } - } - - supportActionBar?.setDisplayHomeAsUpEnabled(true) } private fun initData() { mViewModel.musicList.observe(this, Observer { localMusics: MutableList -> mBinding.srlContainer.isRefreshing = false - mAdapter.setNewData(localMusics) + mItems.clear() + mItems.addAll(localMusics) MusicList.musicList.clear() MusicList.musicList.addAll(localMusics) + mAdapter.items = mItems + mAdapter.notifyDataSetChanged() mBinding.srlContainer.isEnabled = false }) diff --git a/app/src/main/kotlin/com/absinthe/kage/viewholder/DeviceInfoItemViewBinder.kt b/app/src/main/kotlin/com/absinthe/kage/viewholder/DeviceInfoItemViewBinder.kt new file mode 100644 index 0000000..573d51d --- /dev/null +++ b/app/src/main/kotlin/com/absinthe/kage/viewholder/DeviceInfoItemViewBinder.kt @@ -0,0 +1,46 @@ +package com.absinthe.kage.viewholder + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Button +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.absinthe.kage.R +import com.absinthe.kage.device.DeviceManager +import com.absinthe.kage.device.model.DeviceInfo +import com.drakeet.multitype.ItemViewBinder + +class DeviceInfoItemViewBinder : ItemViewBinder() { + + override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder { + val root = inflater.inflate(R.layout.item_device, parent, false) + return ViewHolder(root) + } + + override fun onBindViewHolder(holder: ViewHolder, item: DeviceInfo) { + holder.deviceName.text = item.name + holder.deviceIp.text = item.ip + + when (item.state) { + DeviceInfo.STATE_IDLE -> holder.btnConnect.text = holder.itemView.context.getString(R.string.connect_state_connect) + DeviceInfo.STATE_CONNECTING -> holder.btnConnect.text = holder.itemView.context.getString(R.string.connect_state_connecting) + DeviceInfo.STATE_CONNECTED -> holder.btnConnect.text = holder.itemView.context.getString(R.string.connect_state_connected) + } + + holder.btnConnect.setOnClickListener { + if (!item.isConnected) { + DeviceManager.onlineDevice(item) + DeviceManager.connectDevice(item) + } else { + DeviceManager.disConnectDevice() + } + } + } + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val deviceName: TextView = itemView.findViewById(R.id.tv_device_name) + val deviceIp: TextView = itemView.findViewById(R.id.tv_device_ip) + val btnConnect: Button = itemView.findViewById(R.id.btn_connect) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/absinthe/kage/viewholder/LocalMusicViewBinder.kt b/app/src/main/kotlin/com/absinthe/kage/viewholder/LocalMusicViewBinder.kt new file mode 100644 index 0000000..5cdbc21 --- /dev/null +++ b/app/src/main/kotlin/com/absinthe/kage/viewholder/LocalMusicViewBinder.kt @@ -0,0 +1,53 @@ +package com.absinthe.kage.viewholder + +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.absinthe.kage.R +import com.absinthe.kage.media.audio.LocalMusic +import com.absinthe.kage.media.audio.MusicHelper +import com.absinthe.kage.ui.media.MusicActivity +import com.blankj.utilcode.util.ConvertUtils +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.RoundedCorners +import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import com.bumptech.glide.request.RequestOptions +import com.drakeet.multitype.ItemViewBinder + +class LocalMusicViewBinder : ItemViewBinder() { + + override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder { + val root = inflater.inflate(R.layout.item_music, parent, false) + return ViewHolder(root) + } + + override fun onBindViewHolder(holder: ViewHolder, item: LocalMusic) { + holder.musicName.text = item.title + holder.artist.text = item.artist + + Glide.with(holder.itemView.context) + .load(MusicHelper.getAlbumArt(item.albumId.toLong())) + .transition(DrawableTransitionOptions.withCrossFade()) + .apply(RequestOptions.bitmapTransform(RoundedCorners(ConvertUtils.dp2px(3f)))) + .placeholder(R.drawable.ic_album) + .into(holder.ivAlbum) + + holder.itemView.setOnClickListener { + val intent = Intent(holder.itemView.context, MusicActivity::class.java).apply { + putExtra(MusicActivity.EXTRA_MUSIC_INFO, item) + putExtra(MusicActivity.EXTRA_DEVICE_TYPE, MusicActivity.TYPE_SENDER) + } + holder.itemView.context.startActivity(intent) + } + } + + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val musicName: TextView = itemView.findViewById(R.id.tv_music_name) + val artist: TextView = itemView.findViewById(R.id.tv_artist) + val ivAlbum: ImageView = itemView.findViewById(R.id.iv_album) + } +} \ No newline at end of file diff --git a/app/src/main/kotlin/com/absinthe/kage/adapter/SpacesItemDecoration.java b/app/src/main/kotlin/com/absinthe/kage/viewholder/SpacesItemDecoration.java similarity index 95% rename from app/src/main/kotlin/com/absinthe/kage/adapter/SpacesItemDecoration.java rename to app/src/main/kotlin/com/absinthe/kage/viewholder/SpacesItemDecoration.java index c37cdbd..787acc0 100644 --- a/app/src/main/kotlin/com/absinthe/kage/adapter/SpacesItemDecoration.java +++ b/app/src/main/kotlin/com/absinthe/kage/viewholder/SpacesItemDecoration.java @@ -1,4 +1,4 @@ -package com.absinthe.kage.adapter; +package com.absinthe.kage.viewholder; import androidx.annotation.NonNull; import android.graphics.Rect;