lmw
2025-02-28 3dc12ef829d9bcd6a2a85a7456eb24f304c15c66
app/src/main/java/com/sinata/xqmuse/ui/discovery/DiscoveryFragment.kt
@@ -1,54 +1,43 @@
package com.sinata.xqmuse.ui.discovery
import androidx.recyclerview.widget.LinearLayoutManager
import cn.sinata.xldutils.activity.BaseActivity
import android.Manifest
import androidx.recyclerview.widget.GridLayoutManager
import cn.sinata.xldutils.fragment.BaseFragment
import cn.sinata.xldutils.gone
import cn.sinata.xldutils.visible
import cn.sinata.xldutils.utils.SPUtils
import com.amap.api.location.AMapLocationClient
import com.amap.api.location.AMapLocationClientOption
import com.sinata.xqmuse.XQApplication
import com.sinata.xqmuse.R
import com.sinata.xqmuse.dialog.AddMomentPop
import com.sinata.xqmuse.dialog.TipDialog
import com.sinata.xqmuse.network.HttpManager
import com.sinata.xqmuse.network.entity.Dynamic
import com.sinata.xqmuse.network.entity.Place
import com.sinata.xqmuse.network.requestByF
import com.sinata.xqmuse.ui.discovery.adapter.DynamicAdapter
import com.sinata.xqmuse.ui.discovery.adapter.PlaceAdapter
import com.sinata.xqmuse.utils.Const
import com.sinata.xqmuse.utils.event.EmptyEvent
import com.sinata.xqmuse.utils.extention.clickDelay
import com.sinata.xqmuse.utils.interfaces.StringCallback
import com.tbruyelle.rxpermissions2.RxPermissions
import kotlinx.android.synthetic.main.fragment_discovery.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.jetbrains.anko.support.v4.dip
import org.jetbrains.anko.support.v4.startActivity
import org.jetbrains.anko.support.v4.toast
class DiscoveryFragment : BaseFragment() {
    override fun contentViewId() = R.layout.fragment_discovery
    private val dyns = arrayListOf<Dynamic>()
    private val adapter = DynamicAdapter(dyns)
    private val list = arrayListOf<Place>()
    private val adapter = PlaceAdapter(list)
    private var page = 1
    var search: String? = null //搜索
    override fun onFirstVisibleToUser() {
        EventBus.getDefault().register(this)
        rv_act.layoutManager = LinearLayoutManager(requireContext())
        rv_act.adapter = adapter
        iv_msg.setOnClickListener {
            startActivity<MsgActivity>()
        }
        iv_add.setOnClickListener {
            val pop = AddMomentPop(requireContext())
            pop.setCallback(object : StringCallback {
                override fun onResult(rst: String) {
                    startActivity<PublishActivity>("isVideo" to (rst == "video"))
                }
            })
            pop.showAsDropDown(iv_add,dip(-120),-iv_add.measuredHeight-dip(20))
        }
        rv_list.layoutManager = GridLayoutManager(requireContext(), 2)
        rv_list.adapter = adapter
        adapter.setOnItemClickListener { view, position ->
            startActivity<DynamicActivity>("id" to dyns[position].id)
            startActivity<PlaceDetailActivity>("id" to list[position].id)
        }
        refreshLayout.setOnRefreshListener {
            val s = et_search.text.toString()
@@ -60,47 +49,89 @@
            page++
            getData()
        }
        tv_search.clickDelay {
            val s = et_search.text.toString()
            search = if (s.isNullOrEmpty()) null else s
            (requireActivity() as BaseActivity).hideInputMethod()
            refreshLayout.resetNoMoreData()
            page = 1
            getData()
        et_search.setOnClickListener {
            startActivity<SearchPlaceActivity>()
        }
        getUnread()
        page = 1
        getData()
        checkLocation()
    }
    fun getUnread(){
        HttpManager.messageCount().requestByF(this){_,data->
            if (data?:0>99){
                tv_unread.visible()
                tv_unread.text = "99+"
            }else if (data?:0>0){
                tv_unread.visible()
                tv_unread.text = data.toString()
            }else
                tv_unread.gone()
    private fun checkLocation() {
        val rxPermissions = RxPermissions(requireActivity())
        if (rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)){
            requestLocation()
        }else if (SPUtils.instance().getBoolean(Const.User.LOCATION_REFUSED)){
            refreshLayout.autoRefresh()
        }else{
            TipDialog.show(
                childFragmentManager,
                "为了展示您附近的疗愈馆,我们需要获取该设备的位置权限",
                object : TipDialog.OnClickCallback {
                    override fun onOk() {
                        val subscribe =
                            rxPermissions.request(Manifest.permission.ACCESS_FINE_LOCATION)
                                .subscribe {
                                    if (it) {
                                        requestLocation()
                                    } else {
                                        SPUtils.instance().put(Const.User.LOCATION_REFUSED, true)
                                            .apply()
                                        refreshLayout.autoRefresh()
                                    }
                                }
                        compositeDisposable.add(subscribe)
                    }
                    override fun onCancel() {
                        SPUtils.instance().put(Const.User.LOCATION_REFUSED, true).apply()
                        refreshLayout.autoRefresh()
                    }
                },
                "去授权",
                "取消"
            )
        }
    }
    private fun requestLocation(){
        toast("定位中...")
        var locationClient:AMapLocationClient?
        try {
            locationClient = AMapLocationClient(requireActivity())
        } catch (e: Exception) {
            locationClient = null
        }
        locationClient?.setLocationListener {
            XQApplication.lat = it.latitude
            XQApplication.lon = it.longitude
            refreshLayout.autoRefresh()
        }
        val option = AMapLocationClientOption()
        option.locationPurpose = AMapLocationClientOption.AMapLocationPurpose.SignIn
        option.isOnceLocation = true
        locationClient?.setLocationOption(option)
        //设置场景模式后最好调用一次stop,再调用start以保证场景模式生效
        locationClient?.stopLocation()
        locationClient?.startLocation()
    }
    private fun getData(){
        HttpManager.findList(page,search).requestByF(this,success = {_,data->
            if (page == 1)
                dyns.clear()
            dyns.addAll(data?: arrayListOf())
            adapter.notifyDataSetChanged()
            if (dyns.isEmpty())
                refreshLayout.finishRefreshWithNoMoreData()
            else if (data.isNullOrEmpty())
                refreshLayout.finishLoadMoreWithNoMoreData()
            else if (page == 1)
                refreshLayout.finishRefresh()
            else
                refreshLayout.finishLoadMore()
        }){_,_->
        HttpManager.getMeditationPage(page, search, XQApplication.lat, XQApplication.lon).requestByF(
            this,
            success = { _, data ->
                if (page == 1)
                    list.clear()
                list.addAll(data?.list ?: arrayListOf())
                adapter.notifyDataSetChanged()
                if (list.isEmpty())
                    refreshLayout.finishRefreshWithNoMoreData()
                else if (data?.list?.isNullOrEmpty() == true)
                    refreshLayout.finishLoadMoreWithNoMoreData()
                else if (page == 1)
                    refreshLayout.finishRefresh()
                else
                    refreshLayout.finishLoadMore()
            }){ _, _->
            if (page == 1)
                refreshLayout.finishRefresh(false)
            else
@@ -109,7 +140,7 @@
    }
    @Subscribe
    fun refresh(e:EmptyEvent){
    fun refresh(e: EmptyEvent){
        if (e.code == Const.EventCode.REFRESH_DISCOVERY)
            refreshLayout.autoRefresh()
    }