package com.ydl.confide.home import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.graphics.Color import android.net.Uri import android.os.Build import android.text.TextUtils import android.view.View import android.view.ViewGroup import android.view.WindowManager import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.widget.ImageView import android.widget.RelativeLayout import android.widget.TextView import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.SimpleItemAnimator import com.alibaba.android.arouter.facade.annotation.Route import com.bumptech.glide.Glide import com.bumptech.glide.load.engine.DiskCacheStrategy import com.facebook.drawee.backends.pipeline.Fresco import com.facebook.drawee.interfaces.DraweeController import com.jcodecraeer.xrecyclerview.ProgressStyle import com.jcodecraeer.xrecyclerview.XRecyclerView import com.ydl.audioim.YDLavManager import com.ydl.confide.R import com.ydl.confide.api.ConfideRoute import com.ydl.confide.home.adapter.ConfideHomeAdapter import com.ydl.confide.home.bean.ConfideHomeAllFiltersBean import com.ydl.confide.home.bean.ConfideHomeBodyBean import com.ydl.confide.home.bean.ConfideHomeDataBean import com.ydl.confide.home.bean.ConfideHomeFiterItemBean import com.ydl.confide.home.config.IConfideHomeConfig import com.ydl.confide.home.constants.FinalString import com.ydl.confide.home.constants.FinalString.SEARCH_REQUEST_CODE import com.ydl.confide.home.contract.IConfideHomeContract import com.ydl.confide.home.event.ConfideHomeEventImpl import com.ydl.confide.home.event.IConfideHomeEvent import com.ydl.confide.home.listener.ConfideHomeRecycleViewListener import com.ydl.confide.home.listener.ConfideHomeRecyleSuspendListener import com.ydl.confide.home.listener.HideScrollListener import com.ydl.confide.home.modular.service.ConfideWebServiceImpl import com.ydl.confide.home.presenter.ConfideHomePresenterImpl import com.ydl.confide.home.util.ConfideHomeUtils import com.ydl.confide.home.widget.FilterItemDecoration import com.ydl.confide.router.PhoneCallIn import com.ydl.webview.H5Params import com.ydl.webview.NewH5Activity import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener import com.ydl.ydlcommon.base.config.HttpConfig import com.ydl.ydlcommon.base.config.HttpConfig.Companion.YDL_H5 import com.ydl.ydlcommon.modular.findRouteService import com.ydl.ydlcommon.mvp.lce.BaseLceActivity import com.ydl.ydlcommon.router.IYDLRouterConstant import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils import com.ydl.ydlcommon.utils.remind.ToastHelper import com.ydl.ydlcommon.view.DrawableRightTextView import com.ydl.ydlcommon.view.WrapContentLinearLayoutManager import com.yidianling.common.tools.RxImageTool import com.yidianling.common.tools.ToastUtil import com.yidianling.im.api.service.IImService import com.yidianling.user.api.service.IUserService import kotlinx.android.synthetic.main.confide_home_activity.* import kotlinx.android.synthetic.main.confide_recommend_view_new.view.* import kotlinx.android.synthetic.main.confide_title_bar.* /** * @author yuanwai * @描述:倾诉首页Activity * @Copyright Copyright (c) 2018 * @Company 壹点灵 * @date 2018/8/10 */ @Route(path = ConfideRoute.R_CONFIDE_HOME) class ConfideHomeActivity : BaseLceActivity<IConfideHomeContract.View, IConfideHomeContract.Presenter>(), IConfideHomeContract.View, XRecyclerView.LoadingListener,HideScrollListener { private var listenFree = false override fun getContentViewId(): Int { return R.id.rv_list } override fun getStateViewId(): Int { return R.id.lce_state_view } override fun reLoadData() { } //是否从启动页直接进入 var isSplash: Boolean = false /** * 倾诉首页适配器 */ private var mConfideAdapter: ConfideHomeAdapter? = null /** * 倾诉首页事件处理类 */ private var mConfideEvent: IConfideHomeEvent? = null /** * 数据缓存 */ private var cacheList: MutableList<ConfideHomeDataBean>? = null // 一键倾诉Url private var quickConsultUrl: String? = null /** * 页(从第二页开始) */ private var page: Int = 1 //筛选参数bean private var allFiltersBean: ConfideHomeAllFiltersBean? = null //用于置顶筛选模块监听 private var listScrollListener: ConfideHomeRecycleViewListener? = null //用于显示筛选悬浮View private var listSuspendListener: ConfideHomeRecyleSuspendListener? = null //是否有下一页(用于判断为你推荐条数,如果首页返回少于10条 那么就可以认为没有下一页了) 默认有下一页 private var hasMore = true private var dp48 = 0 private var bottomSheetDialogFragment: ConfideBottomSheetDialogFragment? = null private var keyword: String = ""; init { //初始化参数 initParam() dp48 = RxImageTool.dip2px(48f) } private fun initParam() { allFiltersBean = ConfideHomeAllFiltersBean( page, "", ConfideHomeFiterItemBean().apply { id = "-1" name = "" }, ConfideHomeFiterItemBean().apply { id = "-1" name = "" }, ArrayList(), ArrayList() ) } override fun getContext(): Context { return ConfideHomeActivity@ this } override fun createPresenter(): IConfideHomeContract.Presenter { return ConfideHomePresenterImpl() } override fun layoutResId(): Int { return R.layout.confide_home_activity } /** * 下拉刷新回调 */ override fun onRefresh() { //重置页 page = 1 allFiltersBean!!.page = page clearCacheData() mPresenter.confideHomeRequest(true) recommendList(page) } /** * 上拉加载更多 */ override fun onLoadMore() { recommendList(page + 1) } override fun recommendList(page: Int) { //需要将当前列表已存在的老师uid数组发送到后端去重,因为排序实时变化 this.page = page allFiltersBean!!.page = page allFiltersBean!!.keywords = keyword if (1 == page) { //显示加载中 showProgressDialog() allFiltersBean!!.notInUid = ArrayList() mPresenter.recommendList(ConfideHomeUtils.createParam(allFiltersBean!!)) } else if (page > 1) { var listData = mConfideAdapter?.getList() var notUidList = ArrayList<Int>() if (listData != null) { for (bean in listData) { //列表类型数组 if (bean.type == 5 && bean.body != null) { for (bean in bean.body) { notUidList.add(bean.uid ?: 0) } } } } allFiltersBean!!.notInUid = notUidList mPresenter.recommendListMore(ConfideHomeUtils.createParam(allFiltersBean!!)) } } override fun initDataAndEvent() { //来自首页倾诉红包入口 val isFromRed = intent.getBooleanExtra(IYDLRouterConstant.EXTRA_RED_PACKET, false) val confidedId = intent.getStringExtra(IYDLRouterConstant.EXTRA_CONFIDEDID) val doctorId = intent.getStringExtra(IYDLRouterConstant.EXTRA_DOCTORID) isSplash = intent.getBooleanExtra("isSplash", false) //初始化View initView() mConfideEvent = ConfideHomeEventImpl(this, this) //初始化适配器 initAdapter() //显示加载中 // showProgressDialog() //加载本地缓存 // mPresenter.loadLocalData(this) rv_list.refresh() initClick() initStatusBar() // ModularServiceManager.provide(IConsultantService::class.java).showConfideListDialog(this) // ActionCountUtils.count("daoyi_advertisement_page|daoyi_advertisement_visit","17") // Glide.with(this) // .load(R.drawable.confide__free) // .diskCacheStrategy(DiskCacheStrategy.RESOURCE) // .into(confide_Free) if (isFromRed) { ToastUtil.toastLong(this@ConfideHomeActivity, "红包已领取成功 可立即点击拨打") } if (!confidedId.isNullOrBlank() && !doctorId.isNullOrBlank()) { if (!YDLavManager.isOnlineRtm) { YDLavManager.instances.login( PhoneCallIn.getUserService().getUserInfo()?.uid ) { _: Boolean, _ -> showPayOrDetail(confidedId, doctorId) } } else { showPayOrDetail(confidedId, doctorId) } } } private fun showPayOrDetail(confidedId: String, doctorId: String) { ConfideWebServiceImpl().connectionJava( confidedId.toInt(), 3, this@ConfideHomeActivity, null ) { showDoctorDetail(confidedId, doctorId) } } private fun showDoctorDetail(confideId: String, doctorId: String) { val url = HttpConfig.MH5_URL + ConfideRoute.h5ConfideIntro(confideId) + "&payPage=1" ConfideBottomSheetDialogFragment() .showBottomSheetDialog(this@ConfideHomeActivity, url, doctorId) } override fun onResume() { super.onResume() handleFree() } private fun handleFree() { //登录了回来之后就不显示了 val isLogin = (findRouteService(IUserService::class.java).isLogin()) findViewById<View>(R.id.confide_Free).visibility = if (isLogin) View.GONE else View.VISIBLE if (!isLogin) { val controller: DraweeController = Fresco.newDraweeControllerBuilder() .setUri(Uri.parse("res://drawable/" + R.drawable.confide_first_order)) .setOldController(confide_Free.controller) .setAutoPlayAnimations(true) // 是否自动播放Gif动画 .build() confide_Free.controller = controller } if (isLogin) { findViewById<View>(R.id.confideRed).visibility = if (listenFree) View.VISIBLE else View.GONE Glide.with(this) .load(R.drawable.confide__free) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .into(findViewById<ImageView>(R.id.confideRed)) (quick_consult_btn.layoutParams as? ViewGroup.MarginLayoutParams)?.rightMargin = if (listenFree) dp48 / 2 else 0 } } /** * 初始化状态栏位置 */ private fun initStatusBar() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { window?.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) window?.statusBarColor = Color.WHITE window?.decorView?.systemUiVisibility = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } } /** * 初始化一键倾诉浮层的点击事件 */ private fun initClick() { quick_consult_card.setOnClickListener { ActionCountUtils.record("listen_counselor_list_page", "akey_consult_icon_click") if (!PhoneCallIn.loginByOneKeyLogin(this, true)) { return@setOnClickListener } bottomSheetDialogFragment = ConfideBottomSheetDialogFragment() bottomSheetDialogFragment?.showBottomSheetDialog( this as FragmentActivity, HttpConfig.MH5_URL + ConfideRoute.h5ConfideIntro("0"), "0", true, listenFree = listenFree ) } rl_search_head.setOnClickListener { var intent = Intent(this, ConfideSearchActivity::class.java) if (!TextUtils.isEmpty(keyword)) { intent.putExtra(FinalString.CONFIDE_SEARCH_KEY_WORD, keyword) } startActivityForResult(intent, SEARCH_REQUEST_CODE) } } private fun initView() { img_back.setOnClickListener { finish() } img_mine.setOnClickListener { //跳转倾诉列表 ActionCountUtils.record("listen_counselor_list_page", "topright_corner_icon_click", "1") if (!PhoneCallIn.loginByOneKeyLogin(this, true)) { return@setOnClickListener } val h5Paramsqing = H5Params(YDL_H5 + "confideOrderList", null) NewH5Activity.start(this, h5Paramsqing) } findViewById<View>(R.id.img_customer)?.setOnClickListener { ActionCountUtils.record("listen_counselor_list_page", "topright_corner_icon_click", "2") val imService = findRouteService(IImService::class.java) imService.startP2PXiaoYi(this) } findViewById<View>(R.id.img_help)?.setOnClickListener { ActionCountUtils.record("listen_counselor_list_page", "topright_corner_icon_click", "3") val params = H5Params("https://activity.yidianling.com/activity/qs", "")//倾诉指南 params.isShowMenu = true NewH5Activity.start(this, params) } ll_bar_root.setOnClickListener { } //用于滑动筛选模块置顶 if (null == listScrollListener) { listScrollListener = ConfideHomeRecycleViewListener(this) } rv_list.addOnScrollListener(listScrollListener!!) //用于显示筛选悬浮按钮 if (null == listSuspendListener) { listSuspendListener = ConfideHomeRecyleSuspendListener() } rv_list.addOnScrollListener(listSuspendListener!!) rv_list.addOnScrollListener(YDLImageRecyclerOnScrollListener(ConfideHomeActivity@ this)) if (rv_list.itemAnimator is SimpleItemAnimator) { (rv_list.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false } } /** * 初始化适配器 */ private fun initAdapter() { if (null == mConfideAdapter) { mConfideAdapter = ConfideHomeAdapter(ConfideHomeActivity@ this, mConfideEvent!!, this) } rv_list.addItemDecoration(FilterItemDecoration()) val layoutManager = WrapContentLinearLayoutManager(this, WrapContentLinearLayoutManager.VERTICAL, false) rv_list.layoutManager = layoutManager rv_list.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader) rv_list.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader) rv_list.setArrowImageView(R.drawable.confide_downgrey) rv_list.setLoadingListener(this) rv_list.adapter = mConfideAdapter } /** * 倾诉首页数据请求结果 */ override fun confideHomeResponse(list: MutableList<ConfideHomeDataBean>) { initParam() hideError() cacheList?.addAll(0, list) cacheList?.add( 0, ConfideHomeDataBean(IConfideHomeConfig.TYPE_SEARCH, null, null, null, -1, keyword) ) updateAdapter() setSuspendListener() v_filterView.refreshView() } /** * 设置筛选模块悬浮顶部监听数据 */ private fun setSuspendListener() { listSuspendListener?.setFilterView(v_filterView, rl_search_head, vFilterLine) listSuspendListener?.setSectionAdapter(mConfideAdapter!!) } private fun setHideFilterView() { v_filterView.visibility = View.INVISIBLE v_filterView.setHomeView(this) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == SEARCH_REQUEST_CODE && resultCode == RESULT_OK) { val keyWord = data?.getStringExtra(FinalString.CONFIDE_SEARCH_KEY_WORD) if (keyWord != null) { this.keyword = keyWord page = 1 allFiltersBean = ConfideHomeAllFiltersBean( page, "", ConfideHomeFiterItemBean().apply { id = "-1" name = "" }, ConfideHomeFiterItemBean().apply { id = "-1" name = "" }, ArrayList(), ArrayList() ) rl_search_head.findViewById<TextView>(R.id.etSearch).setText(keyword) onRefresh() } } } /** * 更新适配器数据 */ private fun updateAdapter() { rv_list.removeAllViews() //数据重组 ConfideHomeUtils.resetData(cacheList!!, v_filterView, listScrollListener!!) setHideFilterView() mConfideAdapter?.updateItems(cacheList!!) mConfideAdapter?.notifyDataSetChanged() rv_list.refreshComplete() } /** * 更新适配器数据(用于播放 暂停 状态切换 更新整体数据) */ private fun updateAdapterForPlayStatus() { mConfideAdapter!!.updateItems(cacheList!!) mConfideAdapter!!.notifyDataSetChanged() } private fun clearCacheData() { if (null == cacheList) { cacheList = ArrayList() } else { (cacheList as ArrayList).clear() } } /** * 根据筛选条件 更新为你推荐数据 */ private fun updateCacheDataByRecommend(bean: ConfideHomeDataBean) { //需要重置一下页码 page = 1 if (null == cacheList) { cacheList = ArrayList() } if (bean?.body == null) { v_filterView.visibility = View.GONE } else if (null != bean.body && bean.body.size < 2) { v_filterView.visibility = View.GONE } else { v_filterView.visibility = View.VISIBLE } var soundBean: ConfideHomeDataBean? = null //从后往前循环 这样remove的时候不会有问题 for (index in (0..(cacheList!!.size - 1)).reversed()) { if (cacheList!![index].type == IConfideHomeConfig.TYPE_RECOMMEND) { //移除原有的为你推荐数据 (cacheList as ArrayList).removeAt(index) } else if (cacheList!![index].type == IConfideHomeConfig.TYPE_SOUND) { //移除听声寻人数据 重新添加 soundBean = cacheList!![index] (cacheList as ArrayList).removeAt(index) } } if (bean?.body != null) { bean.recommendId = page //添加为你推荐数据 (cacheList as ArrayList).addAll(ConfideHomeUtils.getRecommendList(bean)) } //添加听声寻人数据 if (null != soundBean) { (cacheList as ArrayList).add(soundBean) } if (bean?.body != null && bean?.body.size == 0) { var hasEmptyLayout: Boolean = false for (index in (0..(cacheList!!.size - 1)).reversed()) { if (cacheList!![index].type == IConfideHomeConfig.TYPE_EMPTY) { hasEmptyLayout = true break } } if (!hasEmptyLayout) { cacheList?.add( ConfideHomeDataBean( IConfideHomeConfig.TYPE_EMPTY, null, null, null, -1 ) ) } } else { for (index in (0..(cacheList!!.size - 1)).reversed()) { if (cacheList!![index].type == IConfideHomeConfig.TYPE_EMPTY) { cacheList!!.removeAt(index) } } } listScrollListener?.moveToPosition(rv_list) } /** * 为你推荐 翻页 请求结果 */ override fun recommendListMoreResponse(bean: ConfideHomeDataBean) { dismissProgressDialog() rv_list.loadMoreComplete() bean.recommendId = page if (bean.body?.size ?: 0 == 0) { rv_list.loadMoreComplete() mConfideAdapter!!.notifyDataSetChanged() return } (cacheList as ArrayList).add(bean) val size = mConfideAdapter!!.itemCount mConfideAdapter!!.addItems(ConfideHomeUtils.getRecommendList(bean)) mConfideAdapter!!.notifyItemInserted(if (size > 0) size + 1 else 0) } /** * 为你推荐 筛选 请求结果 */ override fun recommendListResponse(bean: ConfideHomeDataBean) { dismissProgressDialog() rv_list.loadMoreComplete() updateCacheDataByRecommend(bean) mConfideAdapter!!.updateItems(cacheList!!) // if (bean.body == null || bean.body.size < 10) { // rv_list.setNoMore(true) // } else { // rv_list.loadMoreComplete() // } mConfideAdapter!!.notifyDataSetChanged() if (!bean.body.isNullOrEmpty()) { listenFree = bean.body[0].listenFree ?: false handleFree() } } /** * 倾诉首页数据请求失败 */ override fun confideHomeRequestFail() { showError() } override fun showProgress() { } /** * 更新section的播放状态 * 点击列表中的一个播放按钮 其他播放按钮要显示暂停状态 * @param sectionId * @param index 模块中点击播放的索引位置 */ override fun updataPlayStatu(type: Int?, index: Int, recommendId: Int, isPlaying: Boolean) { ConfideHomeUtils.changeCacheDataPlay(cacheList, type, index, recommendId) updateAdapterForPlayStatus() } override fun moveToFilter() { rv_list.scrollBy(0, 400) listScrollListener?.moveToPosition(rv_list) } override fun showSortPopupWindow( v_line_top: View, tvSort: DrawableRightTextView, bodyBean: ConfideHomeBodyBean? ) { ActionCountUtils.record("listen_counselor_list_page", "choice_filter_click") if (null == allFiltersBean) { return } if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) { listScrollListener?.moveToPosition(rv_list) } mConfideEvent?.showSortPopupWindow( v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!! ) } override fun showSexAgePopupWindow( v_line_top: View, tvSexAge: DrawableRightTextView, bodyBean: ConfideHomeBodyBean? ) { ActionCountUtils.record("listen_counselor_list_page", "choice_filter_click") if (null == allFiltersBean) { return } if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) { listScrollListener?.moveToPosition(rv_list) } mConfideEvent?.showSexAgePopupWindow( v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!! ) } override fun showGoodPopupWindow( v_line_top: View, tvGood: DrawableRightTextView, bodyBean: ConfideHomeBodyBean? ) { ActionCountUtils.record("listen_counselor_list_page", "choice_filter_click") if (null == allFiltersBean) { return } if (v_filterView.visibility == View.GONE || v_filterView.visibility == View.INVISIBLE) { listScrollListener?.moveToPosition(rv_list) } mConfideEvent?.showGoodPopupWindow( v_line_top, v_filterView, bodyBean, allFiltersBean!!, mConfideAdapter!! ) } private fun showError() { rv_list.refreshComplete() } private fun hideError() { rv_list.refreshComplete() rv_list.visibility = View.VISIBLE } override fun showError1(msg: String?) { rv_list.loadMoreComplete() msg?.let { ToastHelper.show(msg) } } @SuppressLint("MissingSuperCall") override fun onDestroy() { super.onDestroy() mConfideEvent!!.destoryPlayer() } override fun onBackPressed() { if (isSplash) { //跳转主页 PhoneCallIn.getAppService().mainIntent(this) } super.onBackPressed() } override fun onHide() { val lp = quick_consult_card.layoutParams as RelativeLayout.LayoutParams quick_consult_card.animate().translationY( (quick_consult_card.height + lp.bottomMargin).toFloat() ).setDuration(1000) .interpolator = AccelerateInterpolator(3f) } override fun onShow() { quick_consult_card.animate().translationY(0F).setDuration(1000) .interpolator = DecelerateInterpolator(3f) } fun searchLinkUrlByUid(uid : String):String{ cacheList?.forEach {confideHomeDataBean -> confideHomeDataBean.body?.forEach { confideHomeBodyBean -> if (uid == confideHomeBodyBean.uid.toString()){ return confideHomeBodyBean.linkUrl?:"" } } } return "" } }