手势操作
手势操作
presenter
import android.app.Activity
import android.graphics.Canvas
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import cn.dreamtobe.kpswitch.util.KeyboardUtil
import com.alexvasilkov.gestures.transition.tracker.SimpleTracker
import com.gotokeep.keep.analytics.AnalyticsAPI
import com.gotokeep.keep.common.extensions.activityViewModels
import com.gotokeep.keep.common.extensions.dp
import com.gotokeep.keep.common.extensions.orFalse
import com.gotokeep.keep.common.extensions.orTrue
import com.gotokeep.keep.common.utils.ActivityUtils
import com.gotokeep.keep.common.utils.RR
import com.gotokeep.keep.common.utils.ToastUtils
import com.gotokeep.keep.commonui.framework.mvp.BasePresenter
import com.gotokeep.keep.data.model.social.post.EntryPostPicPayload
import com.gotokeep.keep.pb.R
import com.gotokeep.keep.pb.edit.image.utils.exchangeListPosition
import com.gotokeep.keep.pb.post.main.activity.EntryPostPicListBottomActivity
import com.gotokeep.keep.pb.post.main.adapter.PictureAdapter
import com.gotokeep.keep.pb.post.main.fragment.EntryPostFragment
import com.gotokeep.keep.pb.post.main.listener.EntryPostPositionTrackListener
import com.gotokeep.keep.pb.post.main.listener.EntryPostRouteListener
import com.gotokeep.keep.pb.post.main.listener.PictureActionListener
import com.gotokeep.keep.pb.post.main.listener.PictureItemClickListener
import com.gotokeep.keep.pb.post.main.mvp.model.EntryPostPictureModel
import com.gotokeep.keep.pb.post.main.mvp.model.PictureItemModel
import com.gotokeep.keep.pb.post.main.mvp.view.EntryPostPictureView
import com.gotokeep.keep.pb.post.main.mvp.view.PostEditImageView
import com.gotokeep.keep.pb.post.main.utils.ACTION_TYPE_CONTENT
import com.gotokeep.keep.pb.post.main.utils.ACTION_TYPE_PICTURE
import com.gotokeep.keep.pb.post.main.utils.MAX_ALBUM_ALL_IMAGES_COUNT
import com.gotokeep.keep.pb.post.main.utils.MAX_ALBUM_IMAGES_COUNT_B
import com.gotokeep.keep.pb.post.main.utils.MAX_IMAGES_COUNT
import com.gotokeep.keep.pb.post.main.utils.REQ_CODE_SHOW_PICTURE
import com.gotokeep.keep.pb.post.main.utils.diffAndClearTempFile
import com.gotokeep.keep.pb.post.main.utils.getSafePhotoList
import com.gotokeep.keep.pb.post.main.utils.trackPostActionClick
import com.gotokeep.keep.pb.post.main.utils.trackPostContent
import com.gotokeep.keep.pb.post.main.viewmodel.EntryPostViewModel
import com.gotokeep.keep.pb.widget.EntryPostPictureItemDecoration
import com.gotokeep.keep.su.api.bean.route.SuGalleryRouteParam
import com.gotokeep.keep.su_core.gallery.GalleryView
import java.util.Collections
import kotlin.math.max
import kotlin.math.min
import kotlinx.android.synthetic.main.su_view_entry_post_picture.view.recyclerView
/**
* 新版发布器图片处理
*
* @author duanlingyu
*/
class EntryPostPicturePresenterV2(recyclerView: EntryPostPictureView):
BasePresenter<EntryPostPictureView, EntryPostPictureModel?>(recyclerView),
DefaultLifecycleObserver {
/**
* 图片或视频的本地路径
*/
private var imagePathList = arrayListOf<String>()
private var pictureAdapter: PictureAdapter
private lateinit var itemTouchHelper: ItemTouchHelper
private var pictureModel: EntryPostPictureModel? = null
private var galleryView: GalleryView? = null
init {
KeyboardUtil.hideKeyboard(view)
pictureAdapter = PictureAdapter(EntryPostFragment.ENTRY_POST_FRAGMENT,
object: PictureItemClickListener {
initItemTouchHelper()
view.recyclerView.apply {
layoutManager = LinearLayoutManager(view.context).apply { orientation =
LinearLayoutManager.HORIZONTAL }
addItemDecoration(EntryPostPictureItemDecoration(right = 8.dp))
adapter = pictureAdapter
}
}
imagePathList.clear()
model.pathList?.let { imagePathList.addAll(it) }
val canAddMore = imagePathList.size < (model.maxImagesCount ?:
MAX_IMAGES_COUNT)
// 组装数据
viewModel.pictureModelList.clear()
if (imagePathList.isNotEmpty()) {
viewModel.pictureModelList.addAll(
getSafePhotoList(
imagePathList,
if (model.isAlbumType) MAX_ALBUM_ALL_IMAGES_COUNT else
MAX_IMAGES_COUNT
).mapIndexed { index, path ->
PictureItemModel(
path,
index,
if (addMorePicNumber(index, model)) TAG_ICON_NUMBER else
null,
size = 82.dp
)
})
}
if (!model.isAlbumType) {
addMoreAndNotify(canAddMore)
}
pictureAction?.onImageUpload(imagePathList)
pictureAdapter.setData(viewModel.pictureModelList.take(MAX_ALBUM_IMAGES_COUNT_B))
}
itemTouchHelper.attachToRecyclerView(view.recyclerView)
}
/**
* 在图片预览页查看图片
*/
private fun checkoutPictures(index: Int, container: ViewGroup) {
trackPostActionClick(ACTION_TYPE_CONTENT)
pictureAction?.onImageCheckoutStart()
val innerContainer: ViewGroup = container
val param = SuGalleryRouteParam.Builder()
.imagePathList(imagePathList)
.startIndex(index)
.editMode(true)
.isAlbumType(pictureModel?.isAlbumType.orFalse())
.setMusicData(pictureModel?.keepMusic)
.requestListener(EntryPostPositionTrackListener(container, object:
SimpleTracker() {
override fun getViewAt(position: Int): View? {
return innerContainer.getChildAt(position)
}
})).build()
galleryView = GalleryView(view.context as FragmentActivity, param).apply {
val isShowEditButton = pictureAction?.hasPhotoEditData().orFalse() ||
pictureModel?.isAlbumType.orTrue()
setFloatPanelView(
PostEditImageView(
this,
isShowEditButton,
!viewModel.postArgs.isPhotoAlbum,
!viewModel.postArgs.isPhotoAlbum
).apply {
setOnEditClickListener { index, block ->
if (viewModel.isContainErrorFile(viewModel.editData)) {
ToastUtils.show(RR.getString(R.string.su_choose_again))
} else {
block.invoke()
routeAction?.openImageEditPage(index)
}
}
setImageDeleteListener {
notifyDataChange()
}
})
setOnGalleryExit { requestCode, resultCode, data ->
if (resultCode == Activity.RESULT_OK && requestCode ==
REQ_CODE_SHOW_PICTURE) {
// 查看图片可能会删掉其中的几张,如果图片数量有变化,需要更新
val paths =
data.getStringArrayListExtra(SuGalleryRouteParam.BUNDLE_KEY_IMAGE_PATH_LIST)
.orEmpty()
pictureAction?.onImageCheckoutEnd(paths)
diffAndClearTempFile(imagePathList, paths)
}
}
setRequestCode(REQ_CODE_SHOW_PICTURE)
show()
}
AnalyticsAPI.track("page_camera_preview", mapOf("type" to "pic"))
}
companion object {
/**
* 添加更多 view 的 type,用来区分特殊条目
*/
const val TAG_ICON_CAMERA = "addMore"
/**
* 点击可以查看更多
*/
const val TAG_ICON_NUMBER = "showMore"
}
}