Commit 290aa8e9 by fengquan

Merge remote-tracking branch 'origin/release' into feat/fq/fq_consulttant_revision_release

parents 1deb8fdc 98bbab77
......@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply from: "../../maven_push_api.gradle"
version = '1.0.0'
version = '1.0.2'
android {
compileSdkVersion rootProject.ext.android["compileSdkVersion"]
......
package com.yidianling.consultant
import com.yidianling.consultant.bean.FunctionWordConsultBean
interface OnBottomWordListener {
fun onBottomWord(wordList: MutableList<FunctionWordConsultBean>)
}
\ No newline at end of file
......@@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment
import com.alibaba.android.arouter.facade.template.IProvider
import com.yidianling.consultant.bean.GuideBean
import com.yidianling.consultant.bean.Keyworks
import com.yidianling.consultant.OnBottomWordListener
/**
* Created by xj on 2019/11/14.
......@@ -39,11 +40,15 @@ interface IConsultantService: IProvider {
fun requestGuideData()
fun jumpConsultAssistant(activity: Activity, location:Int)
fun jumpConsultAssistant(activity: Activity, location: Int)
//根据返回Type跳转自主或者导医
fun dueToTypeJumpAutoOrGuide(activity: Activity, location:Int,doctorId:Int,url:String)
fun dueToTypeJumpAutoOrGuide(activity: Activity, location: Int, doctorId: Int, url: String)
// 咨询列表页显示咨询助理弹框
fun showConfideListDialog(activity: Activity)
//获取底纹词
fun getbottomWord(type: Int, listener: OnBottomWordListener)
}
\ No newline at end of file
package com.yidianling.consultant.bean
data class FunctionWordConsultBean(
var id: Long?,
var word: String?,
var type: Int?,
var jumpUrl: String?
)
\ No newline at end of file
......@@ -8,7 +8,7 @@ ext {
"m-consultant" : "0.0.60.78",
"m-fm" : "0.0.30.09",
"m-user" : "0.0.62.72",
"m-home" : "0.0.24.00",
"m-home" : "0.0.24.04",
"m-im" : "0.0.21.69",
"m-dynamic" : "0.0.7.80",
"m-article" : "0.0.0.10",
......@@ -231,7 +231,7 @@ ext {
"ydl-m-tests-api" : "com.ydl:m-tests-api:1.0.0",
"ydl-m-im-api" : "com.ydl:m-im-api:1.0.3",
"ydl-m-home-api" : "com.ydl:m-home-api:${ydlPublishVersion["m-home-api"]}",
"ydl-m-consultant-api" : "com.ydl:m-consultant-api:1.0.0",
"ydl-m-consultant-api" : "com.ydl:m-consultant-api:1.0.2",
"ydl-m-dynamic-api" : "com.ydl:m-dynamic-api:1.0.0",
"ydl-m-confide-api" : "com.ydl:m-confide-api:1.0.4",
"ydl-m-course-api" : "com.ydl:m-course-api:1.0.0",
......
......@@ -40,6 +40,7 @@ import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxImageTool
import com.yidianling.common.tools.ToastUtil
import com.yidianling.consultant.adapter.ExpertSearchAdapter
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.consultant.constants.ConsultBIConstants
import com.yidianling.consultant.constants.ConsultBIConstants.ConsultEvent.Companion.YDL_USER_CONSULT_SEARCH_CLICK
import com.yidianling.consultant.listener.OnCategoriesSelectedListener
......@@ -53,25 +54,32 @@ import com.yidianling.consultant.ui.view.CategoryPopupWindow
import com.yidianling.consultant.ui.view.FilterPopupWindow
import com.yidianling.consultant.ui.view.SortPopupWindow
import com.yidianling.consultant.ui.view.topView.RecommendListView
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.consultant_activity_expert_search_list.*
import kotlinx.android.synthetic.main.consultant_item_filter_online.view.*
import kotlinx.android.synthetic.main.consultant_layout_search_content.*
import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.*
import org.json.JSONObject
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
@Route(path = "/consult/list")
class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPresenter>(),
View.OnClickListener, IExpertSearchView,
OnCategoriesSelectedListener, OnSortItemSelectedListener, OnFilterConfirmListener,
SwipeRefreshLayout.OnRefreshListener {
var bottomWordDisposable: Disposable? = null
private lateinit var bottomWordlist: List<FunctionWordBean>
private var searchWord: String? = ""
override fun showImage(url: String?, imgView: ImageView) {
YDLImageCacheManager.showImage(ExpertSearchActivity@ this, url, imgView)
}
override fun showImage(url: String?, imgView: ImageView, ops: SimpleImageOpConfiger) {
YDLImageCacheManager.showImage(ExpertSearchActivity@ this, url, imgView, ops)
YDLImageCacheManager.showImage(this, url, imgView, ops)
}
override fun showImage(
......@@ -383,7 +391,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
initCategory = mIntent.getStringExtra(EXTRA_CATEGORY) ?: ""
initShowType = mIntent.getIntExtra(EXTRA_SHOW_TYPE, 0)
val relatedWord = mIntent.getStringExtra(EXTRA_RELATED_WORD) // 搜索内容的联想词
val searchWord = mIntent.getStringExtra(EXTRA_SEARCH_WORD)
searchWord = mIntent.getStringExtra(EXTRA_SEARCH_WORD)
val isRecommendWords = mIntent.getBooleanExtra(EXTRA_IS_RECCOMMEND_WORD, false)
if (!TextUtils.isEmpty(relatedWord)) { // 判断搜索内容的联想词为空,则用搜索词进行搜索
allFilter.searchWord = relatedWord
......@@ -394,7 +402,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
getRouterParam()
allFilter.showType.key = initShowType
if (!TextUtils.isEmpty(initCategory)&&initCategory!="0") {
if (!TextUtils.isEmpty(initCategory) && initCategory != "0") {
allFilter.categoryId2List.add(initCategory)
}
if (!TextUtils.isEmpty(cateName)) {
......@@ -414,11 +422,11 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
LogUtil.e("relatedWord:${relatedWord}")
if (!TextUtils.isEmpty(searchWord) && !TextUtils.isEmpty(relatedWord) && searchWord != relatedWord) {
if (doctorList.size > 0 && doctorList[0].is_head_view) {
doctorList[0] = ExpertServiceItem(true, searchWord, relatedWord)
doctorList[0] = ExpertServiceItem(true, searchWord.toString(), relatedWord)
} else if (doctorList.size > 0) {
doctorList.add(0, ExpertServiceItem(true, searchWord, relatedWord))
doctorList.add(0, ExpertServiceItem(true, searchWord.toString(), relatedWord))
} else {
doctorList.add(ExpertServiceItem(true, searchWord, relatedWord))
doctorList.add(ExpertServiceItem(true, searchWord.toString(), relatedWord))
}
} else {
if (doctorList.size > 0 && doctorList[0].is_head_view) {
......@@ -432,6 +440,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
doctorAdapter.clickCount = 0
doctorAdapter.setIsRecommendWords(isRecommendWords)
doctorAdapter.setEntrance(1)
getPresenter().fetchFunctionWord(2)
}
override fun onNewIntent(intent: Intent?) {
......@@ -511,6 +520,30 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
}
}
override fun onFunctionWordFetched(wordBean: MutableList<FunctionWordBean>) {
//获取底纹词
bottomWordlist = wordBean
if (bottomWordlist.isNullOrEmpty()) return
if (!searchWord.isNullOrEmpty()) {
tv_search_content.text = searchWord
} else {
if (bottomWordlist.size == 1) {
tv_search_content.text = bottomWordlist[0].word
} else {
bottomWordDisposable = Observable.interval(0, 3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
tv_search_content.text =
bottomWordlist[(it % bottomWordlist.size).toInt()].word
}, {
}, {
})
}
}
}
/**
* 热门
*/
......@@ -1559,6 +1592,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
override fun onDestroy() {
super.onDestroy()
mHandler = null
bottomWordDisposable?.dispose()
ConsultAssistantDialogUtils.INSTANCE.expertSearchResetStatus()
}
}
......@@ -4,6 +4,7 @@ import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.ObjectAnimator
import android.animation.PropertyValuesHolder
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Typeface
import android.os.Handler
......@@ -41,6 +42,7 @@ import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxImageTool
import com.yidianling.common.tools.ToastUtil
import com.yidianling.consultant.adapter.ExpertSearchAdapter
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.consultant.constants.ConsultBIConstants
import com.yidianling.consultant.listener.OnCategoriesSelectedListener
import com.yidianling.consultant.listener.OnExpertClickListener
......@@ -56,12 +58,17 @@ import com.yidianling.consultant.ui.view.SortPopupWindow
import com.yidianling.consultant.ui.view.topView.RecommendListView
import com.yidianling.home.api.event.HomeModuleTabEvent
import de.greenrobot.event.EventBus
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.main.consultant_activity_expert_search_list.*
import kotlinx.android.synthetic.main.consultant_item_filter_online.view.*
import kotlinx.android.synthetic.main.consultant_layout_search_content.*
import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.*
import org.json.JSONObject
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
@Route(path = "/consultant/consultant")
class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPresenter>(),
......@@ -73,7 +80,8 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
var startTime = 0L
var endTime = 0L
private var mIdssign1: String = "" // 列表埋点咨询师列表id拼接参数
var bottomWordDisposable: Disposable? = null
private lateinit var bottomWordlist: List<FunctionWordBean>
override fun layoutResId(): Int {
return R.layout.consultant_activity_expert_search_list
}
......@@ -145,6 +153,7 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
const val FROM_FIND_EXPERT = 1
const val FROM_ONLINE_EXPERT = 2
const val PAGE_SIZE = 15
//列表点击回来不刷新列表
var needRefresh = true;
}
......@@ -197,12 +206,13 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
srlContainer.isEnabled = i >= 0
})
doctorAdapter = ExpertSearchAdapter(mContext, this, doctorList,object :OnExpertClickListener{
override fun onExpertClick() {
needRefresh = false
}
doctorAdapter =
ExpertSearchAdapter(mContext, this, doctorList, object : OnExpertClickListener {
override fun onExpertClick() {
needRefresh = false
}
})
})
rvExperts.adapter = doctorAdapter
val layoutManager = LinearLayoutManager(
......@@ -346,6 +356,7 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
allFilter.showType.key = initShowType
getPresenter().fetchListHead()
getPresenter().fetchFunctionWord(2)
recommendListView.requestData("")
v_loading.visibility = View.VISIBLE
......@@ -418,6 +429,26 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
}
}
@SuppressLint("CheckResult")
override fun onFunctionWordFetched(wordBean: MutableList<FunctionWordBean>) {
//获取底纹词
bottomWordlist = wordBean
if (bottomWordlist.isNullOrEmpty()) return
if (bottomWordlist.size == 1) {
tv_search_content.text = bottomWordlist[0].word
} else {
bottomWordDisposable = Observable.interval(0, 3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
tv_search_content.text = bottomWordlist[(it % bottomWordlist.size).toInt()].word
}, {
}, {
})
}
}
/**
* 热门
*/
......@@ -1374,7 +1405,7 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
srlContainer.isRefreshing = isShowRefresh!!
val key = tv_search_content.text.toString()
if (!TextUtils.isEmpty(key.trim())) {
allFilter.searchWord = key.trim()
allFilter.searchWord = null
} else {
allFilter.searchWord = null
}
......@@ -1430,9 +1461,9 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
override fun onResume() {
super.onResume()
if (needRefresh){
if (needRefresh) {
refresh(false)
}else{
} else {
//
needRefresh = true
}
......@@ -1444,6 +1475,7 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
super.onDestroy()
EventBus.getDefault().unregister(this)
mHandler = null
bottomWordDisposable?.dispose()
ConsultAssistantDialogUtils.INSTANCE.resetStatus()
}
}
......@@ -43,6 +43,24 @@ class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() {
})
}
// 查询底纹词
@SuppressLint("CheckResult")
fun fetchFunctionWord(type: Int) {
val map = HashMap<String, Any>()
map["type"] = type
SearchApi.getSearchApi()
.searchFunctionWord(map)
.compose(RxLifecycleUtils.bindToLifecycle(mView))//使用 Rxlifecycle,使 Disposable 和 Activity 一起销毁
.compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ resp ->
mView.onFunctionWordFetched(resp)
}, { t ->
HttpErrorUtils.handleError(BaseApp.getApp(), t)
mView.fetchFailed(t.message)
})
}
@SuppressLint("CheckResult")
fun fetchListData(allFilter: AllFilter, extras: Extras?) {
......@@ -53,7 +71,7 @@ class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() {
// filter
val filterMap = HashMap<String, Any?>()
// 搜索词
if (!TextUtils.isEmpty(allFilter.searchWord)){
if (!TextUtils.isEmpty(allFilter.searchWord)) {
filterMap["__keywords"] = allFilter.searchWord
}
val categoryList = ArrayList<Any>()
......
......@@ -15,6 +15,8 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.alibaba.android.arouter.facade.annotation.Route
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydlcommon.base.BaseMvpActivity
......@@ -30,7 +32,9 @@ import com.yidianling.consultant.adapter.SearchWordsAdapter
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.consultant.bean.*
import com.yidianling.consultant.constants.ConsultBIConstants
import com.yidianling.consultant.constants.ConsultBIConstants.ConsultEvent.Companion.SEARCH_BANNERWORD_CLICK
import com.yidianling.consultant.contract.IHotSearchContract
import com.yidianling.consultant.model.bean.FunctionWordBean
import com.yidianling.consultant.modular.utils.ConsultAssistantEntryUtils
import com.yidianling.consultant.modular.utils.TempH5RouteUtils
import com.yidianling.consultant.presenter.HotSearchPresenterImpl
......@@ -40,14 +44,20 @@ import kotlinx.android.synthetic.main.consultant_item_expert_hot_search.view.*
@Route(path = "/consult/hot_search")
class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchContract.Presenter>(),
IHotSearchContract.View {
private lateinit var searchWordsAdapter: SearchWordsAdapter
private val searchSuggestList: ArrayList<SearchSuggestListBean> = ArrayList()
private var mSearchContent: String = ""
private val CACHE_CONSULT_SEARCH_HISTORY_DATA = "cache_consult_search_history_data"
private val HOT_SEARCH_DOCTOR_NAME = "hot_search_doctor_name"
private var historyList: FixSizeLinkedList<String> = FixSizeLinkedList(15)
private val bannerList = ArrayList<String>()
companion object {
private const val CACHE_CONSULT_SEARCH_HISTORY_DATA = "cache_consult_search_history_data"
private const val HOT_SEARCH_DOCTOR_NAME = "hot_search_doctor_name"
private const val JUMP_WORD = "jump_word"
}
//历史搜索内容的最大宽度
private var maxWidth: Int = 0
......@@ -82,7 +92,7 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
private fun getDataFromIntent() {
val doctorName = intent.getStringExtra(HOT_SEARCH_DOCTOR_NAME)
if (!TextUtils.isEmpty(doctorName)) {
etSearch.setText(doctorName)
etSearch.hint = doctorName
iv_delete_icon.visibility = View.VISIBLE
}
}
......@@ -109,11 +119,20 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
if (TextUtils.isEmpty(relatedWords) && !TextUtils.isEmpty(searchSuggestList[0].suggest_content)) {
relatedWords = searchSuggestList[0].suggest_content
}
doSearch(etSearch.text.toString(), relatedWords, isRecommendWords)
if (searchSuggestList?.get(0)?.suggest_types?.contains(JUMP_WORD)) {
NewH5Activity.start(this, H5Params(searchSuggestList[0].jump_url!!, null))
} else {
if (etSearch.text.toString().isNullOrEmpty()) {
doSearch(etSearch.hint.toString(), relatedWords, isRecommendWords)
} else {
doSearch(etSearch.text.toString(), relatedWords, isRecommendWords)
}
}
} else {
val searchWords = etSearch.text.toString()
if (TextUtils.isEmpty(searchWords)) {
doSearch(searchWords, "", isRecommendWords)
getSearchWords(etSearch.hint.toString(), true)
} else {
getSearchWords(etSearch.text.toString(), true)
}
......@@ -164,7 +183,15 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
relatedWords = searchSuggestList[position].suggest_content
}
}
doSearch(searchSuggestList[position].suggest_content, relatedWords, isRecommendWords)
if (searchSuggestList[position].suggest_types.contains(JUMP_WORD)) {
NewH5Activity.start(this, H5Params(searchSuggestList[position].jump_url!!, null))
} else {
doSearch(
searchSuggestList[position].suggest_content,
relatedWords,
isRecommendWords
)
}
// 埋点
ActionCountUtils.baiDuCountSign3(
......@@ -219,6 +246,7 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
isClickWords: Boolean
) {
if (isClickWords) {
//判断 suggest_classify_types 有值则通过 jump_url跳转
// 搜索的关联词
var relatedWords = ""
var isRecommendWords = false
......@@ -231,7 +259,27 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
relatedWords = searchWordsBean.search_suggests[0].suggest_content
}
}
doSearch(searchContent, relatedWords, isRecommendWords)
if (!searchWordsBean.search_suggests.isNullOrEmpty() && searchWordsBean.search_suggests.get(
0
).suggest_types.contains(JUMP_WORD)
) {
//将数据增加到历史搜索中
if (!TextUtils.isEmpty(searchContent)) {
historyList.remove(searchContent)
historyList.add(searchContent)
SharedPreferencesEditor.putString(
CACHE_CONSULT_SEARCH_HISTORY_DATA,
Gson().toJson(historyList)
)
}
NewH5Activity.start(
this,
H5Params(searchWordsBean.search_suggests[0].jump_url!!, null)
)
finish()
} else {
doSearch(searchContent, relatedWords, isRecommendWords)
}
} else {
searchSuggestList.clear()
if (!searchWordsBean.search_suggests.isNullOrEmpty()) {
......@@ -257,7 +305,9 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
private fun initData() {
initHistoryData()
mPresenter.localData(this)
val mapType = HashMap<String, Any>()
mapType["type"] = 1
mPresenter.searchHotWordData(mapType)
if (etSearch.requestFocus()) {
val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
val isShowing = imm.showSoftInput(etSearch, InputMethodManager.SHOW_IMPLICIT)
......@@ -276,30 +326,36 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
refreshBanner(hotSearchBean.focusList)
}
override fun requestFail() {
refreshBanner(null)
}
//刷新 热门搜索
private fun refreshHotSearchData(keywordData: MutableList<HotSearchKeyWordDataBean>?) {
if (null == keywordData || keywordData.isEmpty()) {
override fun searchHotWordData(wordList: MutableList<FunctionWordBean>) {
//热门词搜索结果
if (wordList.isEmpty()) {
llHotSearch.visibility = View.GONE
return
}
llHotSearch.visibility = View.VISIBLE
flHotSearch.removeAllViews()
for (index in keywordData.indices) {
for (index in wordList.indices) {
val view = LayoutInflater.from(this)
.inflate(R.layout.consultant_item_expert_hot_search, flHotSearch, false)
view.tvHotSearch.text = keywordData[index].keyword
view.tvHotSearch.text = wordList[index].word
view.setOnClickListener {
getSearchWords(keywordData[index].keyword!!, true)
ActionCountUtils.count(SEARCH_BANNERWORD_CLICK, wordList[index].word!!, "热门搜索")
getSearchWords(wordList[index].word!!, true)
}
flHotSearch.addView(view)
}
}
override fun requestFail() {
refreshBanner(null)
}
//刷新 热门搜索
private fun refreshHotSearchData(keywordData: MutableList<HotSearchKeyWordDataBean>?) {
//旧的热门搜索
}
//刷新 本周热门专家
private fun refreshHotExpertData(hotSearchExpert: MutableList<HotSearchPopularDoctorBean>?) {
if (null == hotSearchExpert || hotSearchExpert.isEmpty()) {
......@@ -326,7 +382,12 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
}
}
view.setOnClickListener {
getSearchWords(hotSearchExpert[index].name!!, true)
ActionCountUtils.count(
SEARCH_BANNERWORD_CLICK,
hotSearchExpert[index].name.toString(),
"本周热门专家"
)
getSearchWords(hotSearchExpert[index].name.toString(), true)
}
flHotExpert.addView(view)
}
......@@ -388,6 +449,8 @@ class HotSearchActivity : BaseMvpActivity<IHotSearchContract.View, IHotSearchCon
break
}
view.setOnClickListener {
//历史搜索
ActionCountUtils.count(SEARCH_BANNERWORD_CLICK, historyStr, "历史搜索")
getSearchWords(historyStr, true)
}
fl_search_history.addView(view)
......
......@@ -3,8 +3,10 @@ package com.yidianling.consultant
import android.widget.ImageView
import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydlcommon.mvp.base.IView
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.consultant.model.bean.ExpertServiceItem
import com.yidianling.consultant.model.bean.Extras
import com.yidianling.consultant.model.bean.FunctionWordBean
import com.yidianling.consultant.model.bean.HeadData
/**
......@@ -16,7 +18,8 @@ interface IExpertSearchView : IView {
fun localData()
fun onHeadFetched(headData: HeadData?)
fun onDoctorListFetched(data: MutableList<ExpertServiceItem>, extras: Extras?,curPage:Int)
fun onFunctionWordFetched(wordBean: MutableList<FunctionWordBean>)
fun onDoctorListFetched(data: MutableList<ExpertServiceItem>, extras: Extras?, curPage: Int)
fun fetchFailed(msg: String?)
fun fetchListFailed(msg: String?)
fun fetchListEmpty(msg: String?)
......
......@@ -402,8 +402,6 @@ class ExpertSearchAdapter(
}
}
} else if (holder is FooterViewHolder) {
LogUtil.e("${listData.size}")
LogUtil.e("${hasMore}")
if (hasMore) {
holder.itemView.visibility = View.VISIBLE
holder.pbLoading.visibility = View.VISIBLE
......
......@@ -8,11 +8,13 @@ data class SearchWordsBean(
)
data class SearchSuggestListBean(
val id:String,
val score:String,
val suggest_content:String,
val suggest_relations:ArrayList<String>,
val id: String,
val score: String,
val suggest_content: String,
val suggest_relations: ArrayList<String>,
val search_count: Int,
val suggest_classify_types:ArrayList<String>,
val mapping_classify_type_exist:Boolean
val suggest_classify_types: ArrayList<String>?,
val mapping_classify_type_exist: Boolean,
val jump_url: String?,
val suggest_types: ArrayList<String>
)
\ No newline at end of file
......@@ -58,10 +58,16 @@ class ConsultBIConstants {
const val YDL_USER_CONSULT_TYPE_CLICK: String =
APP_CONSULT_LIST_PAGE + "ydl_user_consult_type_click"//咨询师顶部ICON 厌学专题、限时特惠、精神心理
const val POSITION_CONSULT_COUNSELOR_CARD_CLICK="consult_counselor_card_click" // 咨询师列表点击position
const val POSITION_CHOICE_FILTER_CLICK="choice_filter_click" // 热门点击项position
const val POSITION_TWO_CATEGORY_CLICK="two_category_click" // 八大类标签选择埋点
const val POSITION_GOODAT_CROWD_CLICK="goodat_crowd_click" // 擅长人群埋点
const val POSITION_CONSULT_COUNSELOR_CARD_CLICK =
"consult_counselor_card_click" // 咨询师列表点击position
const val POSITION_CHOICE_FILTER_CLICK =
"choice_filter_click" // 热门点击项position
const val POSITION_TWO_CATEGORY_CLICK =
"two_category_click" // 八大类标签选择埋点
const val POSITION_GOODAT_CROWD_CLICK =
"goodat_crowd_click" // 擅长人群埋点
const val SEARCH_BANNERWORD_CLICK =
"$PART_ID_YDL_USER_MAIN_PAGE|search_bannerword_click" //历史搜索、热门搜索、本周热门专家搜索
}
}
class ConsultSearchListEvent {
......
package com.yidianling.consultant.contract
import android.content.Context
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.mvp.base.IModel
import com.ydl.ydlcommon.mvp.base.IPresenter
import com.ydl.ydlcommon.mvp.base.IView
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.bean.SearchWordsBean
import com.yidianling.consultant.model.bean.FunctionWordBean
import io.reactivex.Observable
/**
......@@ -24,6 +26,11 @@ class IHotSearchContract {
fun searchDataResponse(hotSearchBean: HotSearchBean)
/**
* 搜索页请求热门词
*/
fun searchHotWordData(wordList: MutableList<FunctionWordBean>)
/**
* 请求失败
*/
fun requestFail()
......@@ -31,7 +38,11 @@ class IHotSearchContract {
/**
* 联想词请求成功结果
*/
fun getSearchWordsSuccess(searchWordsBean: SearchWordsBean,searchContent:String,isClickWords:Boolean)
fun getSearchWordsSuccess(
searchWordsBean: SearchWordsBean,
searchContent: String,
isClickWords: Boolean
)
}
interface Presenter : IPresenter<View> {
......@@ -46,9 +57,14 @@ class IHotSearchContract {
fun searchData()
/**
* 搜索页请求热门词
*/
fun searchHotWordData(map: HashMap<String, Any>)
/**
* 获取联想词
*/
fun getSearchWords(map:HashMap<String,Any>,searchContent:String,isClickWords:Boolean)
fun getSearchWords(map: HashMap<String, Any>, searchContent: String, isClickWords: Boolean)
}
interface Model : IModel {
......@@ -60,6 +76,11 @@ class IHotSearchContract {
/**
* 获取到联想词
*/
fun getSearchWords(map:HashMap<String,Any>): Observable<SearchWordsBean>
fun getSearchWords(map: HashMap<String, Any>): Observable<SearchWordsBean>
/**
* 搜索页请求热门词
*/
fun searchHotWordData(map: HashMap<String, Any>): Observable<BaseAPIResponse<MutableList<FunctionWordBean>>>
}
}
\ No newline at end of file
......@@ -3,10 +3,13 @@ package com.yidianling.consultant.http.hotsearch
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.bean.HotSearchKeyWordDataBean
import com.yidianling.consultant.bean.SearchWordsBean
import com.yidianling.consultant.http.ExpertSearchParam
import com.yidianling.consultant.model.SearchApi
import com.yidianling.consultant.model.bean.FunctionWordBean
import io.reactivex.Observable
/**
......@@ -43,9 +46,13 @@ class HotSearchHttpImpl : IHotSearchHttp {
override fun searchData(): Observable<BaseAPIResponse<HotSearchBean>> {
return RxUtils.mapObservable(ExpertSearchParam(""))
.flatMap {
getSearchApi().searchPage()
}
.flatMap {
getSearchApi().searchPage()
}
}
override fun searchHotWordData(map: HashMap<String, Any>): Observable<BaseAPIResponse<MutableList<FunctionWordBean>>> {
return getSearchApi().searchFunctionWord(map)
}
override fun getSearchWords(map: HashMap<String, Any>): Observable<BaseAPIResponse<SearchWordsBean>> {
......
......@@ -3,6 +3,7 @@ package com.yidianling.consultant.http.hotsearch
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.bean.SearchWordsBean
import com.yidianling.consultant.model.bean.FunctionWordBean
import io.reactivex.Observable
/**
......@@ -12,14 +13,19 @@ import io.reactivex.Observable
* @Company 壹点灵
* @date 2018/7/26
*/
interface IHotSearchHttp{
interface IHotSearchHttp {
/**
* 搜索页请求
*/
fun searchData(): Observable<BaseAPIResponse<HotSearchBean>>
/**
* 搜索页请求热门词
*/
fun searchHotWordData(map: HashMap<String, Any>): Observable<BaseAPIResponse<MutableList<FunctionWordBean>>>
/**
* 搜索联想词请求
*/
fun getSearchWords(map:HashMap<String,Any>): Observable<BaseAPIResponse<SearchWordsBean>>
fun getSearchWords(map: HashMap<String, Any>): Observable<BaseAPIResponse<SearchWordsBean>>
}
\ No newline at end of file
package com.yidianling.consultant.model
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.RxUtils
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.bean.SearchWordsBean
import com.yidianling.consultant.contract.IHotSearchContract
import com.yidianling.consultant.http.hotsearch.HotSearchDataManager
import com.yidianling.consultant.model.bean.FunctionWordBean
import io.reactivex.Observable
/**
......@@ -14,12 +16,16 @@ import io.reactivex.Observable
* @Company 壹点灵
* @date 2018/7/26
*/
class HotSearchModelImpl : IHotSearchContract.Model{
class HotSearchModelImpl : IHotSearchContract.Model {
override fun searchData(): Observable<HotSearchBean> {
return HotSearchDataManager.getHttp().searchData().compose(RxUtils.resultJavaData())
}
override fun getSearchWords(map:HashMap<String,Any>): Observable<SearchWordsBean> {
override fun getSearchWords(map: HashMap<String, Any>): Observable<SearchWordsBean> {
return HotSearchDataManager.getHttp().getSearchWords(map).compose(RxUtils.resultJavaData())
}
override fun searchHotWordData(map: HashMap<String, Any>): Observable<BaseAPIResponse<MutableList<FunctionWordBean>>> {
return HotSearchDataManager.getHttp().searchHotWordData(map)
}
}
\ No newline at end of file
......@@ -6,11 +6,9 @@ import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.consultant.bean.ExpertSearchTopShowBean
import com.yidianling.consultant.bean.GuideBean
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.bean.SearchWordsBean
import com.yidianling.consultant.bean.*
import com.yidianling.consultant.model.bean.ExpertBean
import com.yidianling.consultant.model.bean.FunctionWordBean
import com.yidianling.consultant.model.bean.HeadData
import io.reactivex.Observable
import retrofit2.http.*
......@@ -43,13 +41,24 @@ interface SearchApi {
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun searchConditions(@Query("cateSource") cateSource: Int): Observable<BaseAPIResponse<HeadData>>
//查询功能词、底纹词
//(1热门词,2底纹词,3跳转词)
@POST("function/word/queryList")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun searchFunctionWord(@Body map: Map<String, @JvmSuppressWildcards Any>): Observable<BaseAPIResponse<MutableList<FunctionWordBean>>>
//查询功能词、底纹词
//(1热门词,2底纹词,3跳转词)
@POST("function/word/queryList")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun searchFunctionWordApi(@Body map: Map<String, @JvmSuppressWildcards Any>): Observable<BaseAPIResponse<MutableList<FunctionWordConsultBean>>>
/**
* 新咨询师列表接口(包含搜索、筛选咨询师)
*/
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA,"X-App-Id: plough_cloud")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA, "X-App-Id: plough_cloud")
@POST("smart-rank/v1/search")
fun getExpertList(@Body map: Map<String,@JvmSuppressWildcards Any>):Observable<BaseAPIResponse<ExpertBean>>
fun getExpertList(@Body map: Map<String, @JvmSuppressWildcards Any>): Observable<BaseAPIResponse<ExpertBean>>
/**
* 获取搜索联想词
......
package com.yidianling.consultant.model.bean
data class FunctionWordBean(
var id: Long?,
var word: String?,
var type: Int?,
var jumpUrl: String?
)
\ No newline at end of file
......@@ -9,14 +9,17 @@ import android.text.TextUtils
import com.alibaba.android.arouter.facade.annotation.Route
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.ydl.ydlcommon.base.BaseApp
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.yidianling.common.tools.LogUtil
import com.ydl.ydlcommon.utils.remind.HttpErrorUtils
import com.yidianling.consultant.ExpertSearchActivity
import com.yidianling.consultant.ExpertSearchFragment
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.consultant.bean.GuideBean
import com.yidianling.consultant.bean.Keyworks
import com.yidianling.consultant.data.ConsultantDataManager
import com.yidianling.consultant.OnBottomWordListener
import com.yidianling.consultant.model.SearchApi
import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils
import com.yidianling.consultant.modular.utils.ConsultAssistantEntryUtils
......@@ -118,14 +121,34 @@ class ConsultantServiceImp : IConsultantService {
ConsultAssistantEntryUtils.jumpConsultAssistant(activity,location,null)
}
override fun dueToTypeJumpAutoOrGuide(activity: Activity, location: Int, doctorId: Int,url:String) {
ConsultAssistantEntryUtils.getTypeJump(activity,location,doctorId,url)
override fun dueToTypeJumpAutoOrGuide(
activity: Activity,
location: Int,
doctorId: Int,
url: String
) {
ConsultAssistantEntryUtils.getTypeJump(activity, location, doctorId, url)
}
override fun showConfideListDialog(activity: Activity) {
ConsultAssistantDialogUtils.INSTANCE.showFromConfideListHome(activity)
}
@SuppressLint("CheckResult")
override fun getbottomWord(type: Int, listener: OnBottomWordListener) {
val map = hashMapOf("type" to type)
SearchApi.getSearchApi()
.searchFunctionWordApi(map)
.compose(RxUtils.resultJavaData())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({ resp ->
listener.onBottomWord(resp)
}, { t ->
HttpErrorUtils.handleError(BaseApp.getApp(), t)
})
}
override fun resetConsultAssistantDialogStatus() {
ConsultAssistantDialogUtils.INSTANCE.resetStatus()
}
......
......@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
import android.content.Context
import android.text.TextUtils
import com.google.gson.Gson
import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.mvp.base.BasePresenter
import com.ydl.ydlcommon.utils.RxLifecycleUtils
......@@ -13,6 +14,8 @@ import com.yidianling.common.tools.ToastUtil
import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.contract.IHotSearchContract
import com.yidianling.consultant.model.HotSearchModelImpl
import com.yidianling.consultant.model.bean.FunctionWordBean
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
......@@ -66,25 +69,43 @@ class HotSearchPresenterImpl : BasePresenter<IHotSearchContract.View, IHotSearch
.filter { it != null }
.compose(RxLifecycleUtils.bindToLifecycle(mView!!))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.searchDataResponse(it)
YDLCacheUtils.saveHotSearchData(Gson().toJson(it))
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.requestFail()
}
})
.subscribe(Consumer {
mView.searchDataResponse(it)
YDLCacheUtils.saveHotSearchData(Gson().toJson(it))
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.requestFail()
}
})
}
@SuppressLint("CheckResult")
override fun searchHotWordData(map: HashMap<String, Any>) {
mModel.searchHotWordData(map).compose(RxLifecycleUtils.bindToLifecycle(mView!!))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.searchHotWordData(it.data)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.requestFail()
}
})
}
@SuppressLint("CheckResult")
override fun getSearchWords(map:HashMap<String,Any>,searchContent:String,isClickWords:Boolean) {
override fun getSearchWords(
map: HashMap<String, Any>,
searchContent: String,
isClickWords: Boolean
) {
mModel.getSearchWords(map)
// .debounce(500L, TimeUnit.MILLISECONDS)
.compose(RxLifecycleUtils.bindToLifecycle(mView))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.getSearchWordsSuccess(it,searchContent,isClickWords)
mView.getSearchWordsSuccess(it, searchContent, isClickWords)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
ToastUtil.toastShort(msg)
......
......@@ -22,7 +22,9 @@ import com.ydl.ydlcommon.utils.StatusBarUtils
import com.ydl.ydlcommon.utils.Utils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.yidianling.consultant.OnBottomWordListener
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.home.R
import com.yidianling.home.adapter.YdlHomeAdapter
import com.yidianling.home.constants.HomeBIConstants
......@@ -37,9 +39,14 @@ import com.yidianling.home.presenter.HomePresenterImpl
import com.yidianling.home.ui.view.CouponDialog
import com.yidianling.im.api.service.IImService
import com.yidianling.user.api.service.IUserService
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.xlzx.home_fragment_home_module.*
import kotlinx.android.synthetic.xlzx.home_layout_home_module_content.*
import kotlinx.android.synthetic.xlzx.home_layout_home_module_input.*
import java.util.concurrent.TimeUnit
import kotlin.properties.Delegates
......@@ -86,6 +93,8 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
private var isFromCreate: Boolean = true
var startTime = System.currentTimeMillis()
var endTime by Delegates.notNull<Long>()
private lateinit var bottomWordlist: MutableList<FunctionWordConsultBean>
var bottomWordDisposable: Disposable? = null
override fun layoutResId(): Int {
return R.layout.home_fragment_home_module
}
......@@ -100,6 +109,7 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
homeEvent = HomeImpl(mActivity!!, this)
initView()
initAdapter()
getBottomWord()
}
private fun initAdapter() {
......@@ -126,7 +136,7 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
)
home_swipe_refresh_layout.setProgressViewOffset(false, 0, 200)
home_swipe_refresh_layout.isEnabled = true
etSearch.setOnClickListener { homeEvent?.searchTvClick("") }
etSearch.setOnClickListener { homeEvent?.searchTvClick(etSearch.hint.toString()) }
home_page_xiaoyi.setOnClickListener {
activity?.let {
......@@ -377,4 +387,33 @@ class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterImpl>()
showConsultAssistantDialog()
}
}
private fun getBottomWord() {
ModularServiceManager.provide(IConsultantService::class.java)
.getbottomWord(2, object : OnBottomWordListener {
override fun onBottomWord(wordList: MutableList<FunctionWordConsultBean>) {
bottomWordlist = wordList
if (bottomWordlist.isNullOrEmpty()) return
if (bottomWordlist.size == 1) {
etSearch.hint = bottomWordlist[0].word
} else {
if (bottomWordDisposable != null) {
bottomWordDisposable?.dispose()
} else {
bottomWordDisposable = Observable.interval(0, 3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
etSearch.hint =
bottomWordlist[(it % bottomWordlist.size).toInt()].word
}, {
}, {
})
}
}
}
})
}
}
\ No newline at end of file
......@@ -26,7 +26,9 @@ import com.ydl.ydlcommon.base.BaseMvpFragment
import com.ydl.ydlcommon.modular.ModularServiceManager
import com.ydl.ydlcommon.utils.*
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.yidianling.consultant.OnBottomWordListener
import com.yidianling.consultant.api.IConsultantService
import com.yidianling.consultant.bean.FunctionWordConsultBean
import com.yidianling.home.R
import com.yidianling.home.adapter.YdlHomeAdapter
import com.yidianling.home.constants.HomeBIConstants
......@@ -42,10 +44,15 @@ import com.yidianling.home.ui.view.CouponDialog
import com.yidianling.home.ui.view.HomeSpaceItemDecoration
import com.yidianling.home.utils.HomeAnimUtils
import com.yidianling.user.api.service.IUserService
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import kotlinx.android.synthetic.ydl.home_fragment.*
import kotlinx.android.synthetic.ydl.home_fragment.tab_layout
import kotlinx.android.synthetic.ydl.home_muse_view.*
import kotlinx.android.synthetic.ydl.home_muse_view.view.*
import java.util.concurrent.TimeUnit
import kotlin.properties.Delegates
......@@ -99,13 +106,15 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
open var searchText: String = ""
open var doctorName: String = ""
var startTime =0L
var endTime =0L
var startTime = 0L
var endTime = 0L
/**
* 如果是第一次加载,则调用所有接口进行刷新,否则,只调用咨询和倾诉接口
*/
private var isFromCreate: Boolean = true
private lateinit var bottomWordlist: MutableList<FunctionWordConsultBean>
var bottomWordDisposable: Disposable? = null
override fun layoutResId(): Int {
return R.layout.home_fragment
......@@ -122,6 +131,7 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
open fun initHomeEvent() {
homeEvent = HomeImpl(mActivity, this)
getBottomWord()
}
private fun initAdapter() {
......@@ -173,17 +183,17 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
}
open fun initSearchBar() {
if (!TextUtils.isEmpty(doctorName)) {
searchText = doctorName
}
// if (!TextUtils.isEmpty(doctorName)) {
// searchText = doctorName
// }
home_tv.setOnClickListener {
homeEvent?.searchTvClick(searchText)
homeEvent?.searchTvClick(home_tv.text.toString())
}
iv_search_icon.setOnClickListener {
homeEvent?.searchTvClick(searchText)
}
home_tv.text = searchText
// home_tv.text = searchText
}
/**
......@@ -228,25 +238,11 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
}
override fun startAnim() {
HomeAnimUtils.startAnim(mContext, rl_top, rl_search, home_service_call, home_tv)
HomeAnimUtils.startSearchShow(
ll_top_function,
view_search_input_bg,
home_tv,
iv_search_icon,
img_ad
)
}
override fun endAnim() {
HomeAnimUtils.endAnim(mContext, rl_top, rl_search, home_tv, home_service_call, this)
HomeAnimUtils.startSearchHide(
ll_top_function,
view_search_input_bg,
home_tv,
iv_search_icon,
img_ad
)
}
override fun getSearchContent(): String {
......@@ -515,6 +511,35 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
.showConsultAssistantDialog(mActivity)
}
private fun getBottomWord() {
ModularServiceManager.provide(IConsultantService::class.java)
.getbottomWord(2, object : OnBottomWordListener {
override fun onBottomWord(wordList: MutableList<FunctionWordConsultBean>) {
bottomWordlist = wordList
if (bottomWordlist.isNullOrEmpty()) return
if (bottomWordlist.size == 1) {
home_tv.text = bottomWordlist[0].word
} else {
if (bottomWordDisposable != null) {
bottomWordDisposable?.dispose()
} else {
bottomWordDisposable = Observable.interval(0, 3, TimeUnit.SECONDS)
.subscribeOn(Schedulers.computation())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
home_tv.text =
bottomWordlist[(it % bottomWordlist.size).toInt()].word
}, {
}, {
})
}
}
}
})
}
private fun hideConsultAssistantDialog() {
ModularServiceManager.provide(IConsultantService::class.java).hideConsultAssistantDialog()
}
......@@ -662,5 +687,6 @@ open class YdlHomeFragment : BaseMvpFragment<IHomeContract.View, HomePresenterIm
override fun onDestroyView() {
super.onDestroyView()
HomeAnimUtils.clear()
bottomWordDisposable?.dispose()
}
}
\ No newline at end of file
......@@ -91,17 +91,6 @@
android:permission="android.permission.BIND_JOB_SERVICE"
android:process=":core" />
<!-- 云信SDK的监视系统启动和网络变化的广播接收器,用户开机自启动以及网络变化时候重新登录 -->
<receiver
android:name="com.netease.nimlib.service.NimReceiver"
android:exported="false"
android:process=":core">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
<!-- 云信进程间通信receiver -->
<receiver android:name="com.netease.nimlib.service.ResponseReceiver" />
......
......@@ -35,7 +35,9 @@ android {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dataBinding {
enabled true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
......
......@@ -157,10 +157,10 @@
android:name=".mine.EditAccountActivity"
android:screenOrientation="portrait"
android:theme="@style/platform_NoTitleTheme" />
<!--添加提现账号-->
<activity
android:name=".mine.AddAccountActivity"
android:screenOrientation="portrait"
android:theme="@style/platform_NoTitleTheme" />
android:screenOrientation="portrait" />
<activity
android:name=".mine.RechargeResultActivity"
android:screenOrientation="portrait"
......
package com.yidianling.user.mine
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import android.view.View
import com.ydl.ydlcommon.adapter.FragmentWithTabPagerAdapter
import com.ydl.ydlcommon.base.BaseActivity
import com.ydl.ydlcommon.bean.StatusBarOptions
import com.ydl.ydlcommon.view.widgets.TopTabSelectLayout
import android.os.Bundle
import android.text.TextUtils
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.yidianling.common.tools.ToastUtil
import com.yidianling.user.R
import com.yidianling.user.mine.fragment.AddAliAccountFragment
import com.yidianling.user.mine.fragment.AddBankAccountFragment
import com.yidianling.user.databinding.UserMineActivityAddAccountBinding
import com.yidianling.user.mine.bean.AddAccountCmd
import com.yidianling.user.mine.data.AppDataManager
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.user_mine_activity_add_account.*
/**
* 添加提现帐号
*/
class AddAccountActivity : BaseActivity() {
* @author liupeng
* 添加提现账号
* */
class AddAccountActivity : AppCompatActivity() {
private lateinit var binding: UserMineActivityAddAccountBinding
companion object {
fun startForResult(activity: Activity, request: Int) {
......@@ -26,47 +33,48 @@ class AddAccountActivity : BaseActivity() {
}
}
override fun getStatusViewOptions(): StatusBarOptions {
return StatusBarOptions(true, true)
}
override fun layoutResId(): Int {
return R.layout.user_mine_activity_add_account
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.user_mine_activity_add_account)
btn_ensure.setOnClickListener {
saveAccount()
}
}
override fun initDataAndEvent() {
var titles = mutableListOf<String>()
titles.add("支付宝")
titles.add("银行卡")
var fragments = mutableListOf<Fragment>()
fragments.add(AddAliAccountFragment())
fragments.add(AddBankAccountFragment())
var adapter = FragmentWithTabPagerAdapter(supportFragmentManager, titles, fragments)
top_layout.setButtonTitle("支付宝", "银行卡")
top_layout.setSelectIndex(0)
top_layout.setLineViewVisible(View.GONE)
top_layout.setOnSelectTabClickListener(object : TopTabSelectLayout.OnSelectTabClickListener {
override fun selectTabClickListener(index: Int) {
viewpager.currentItem = index
}
override fun onReturnClickListener() {
}
})
viewpager.currentItem = 0
viewpager.adapter = adapter
viewpager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
top_layout.setSelectIndex(position)
}
override fun onPageScrollStateChanged(state: Int) {
/**
* 保存支付宝帐号
*/
@SuppressLint("CheckResult")
private fun saveAccount() {
var account = et_account.text.trim().toString()
if (TextUtils.isEmpty(account)) {
ToastUtil.toastShort("支付宝帐号不能为空")
return
}
var name = et_name.text.trim().toString()
if (TextUtils.isEmpty(name)) {
ToastUtil.toastShort("姓名不能为空")
return
}
}
})
var param = AddAccountCmd(name, account, "1")
AppDataManager.getHttp().addAccount(param)
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {bean ->
if (bean == null) {
ToastUtil.toastShort("返回数据错误")
} else {
ToastUtil.toastShort("添加帐号成功")
var intent = Intent()
intent.putExtra(ChooseAccountActivity.ADD_ACCOUNT_REQUEST_KEY, bean)
setResult(Activity.RESULT_OK, intent)
finish()
}
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
ToastUtil.toastShort(msg)
}
})
}
}
}
\ No newline at end of file
......@@ -138,18 +138,25 @@ class ChooseAccountActivity : BaseActivity() {
TransferCacheUtils.removeTransferData(INTENT_DATA)
}
if (requestCode == ADD_ACCOUNT_REQUEST_CODE) {//添加帐号页面返回
val bean: AccountBean = TransferCacheUtils.getTransferData(ADD_ACCOUNT_REQUEST_CODE) as AccountBean
dataLists!!.add(1, bean)
adapter!!.notifyDataSetChanged()
try {//添加帐号页面返回
val bean = data?.getParcelableExtra<AccountBean>(ADD_ACCOUNT_REQUEST_KEY)
bean?.let {
dataLists?.add(1, bean)
adapter?.notifyDataSetChanged()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
companion object {
const val INTENT_LIST = "intent_list"
const val INTENT_DATA = "intent_data"
const val INTENT_DATA_REQUEST_CODE = 1024
//添加帐号
const val ADD_ACCOUNT_REQUEST_CODE = 1025
const val ADD_ACCOUNT_REQUEST_KEY = "add_key"
fun startForResult(activity: Activity, list: MutableList<AccountBean>, code: Int) {
val intent = Intent(activity, ChooseAccountActivity::class.java)
TransferCacheUtils.putTransferData(INTENT_LIST, list)
......
package com.yidianling.user.mine.bean
import android.os.Parcel
import android.os.Parcelable
/**
* Created by jiucheng on 2018/7/13.
* 功能:
*/
class AccountBean {
class AccountBean() :Parcelable{
var id: String? = null//id
var uid: String? = null//id
var type: Int? = -1//1,//账号类型:1、支付宝;2、微信;3、银行卡
......@@ -17,4 +20,48 @@ class AccountBean {
var remark: String? = null//工作日9-18点,到账时间:2小时内;休息日顺延至下一个工作日
var isDefault: Int = -1//默认账户 1默认2非默认
var status: Int = -1//1' => "未审核", '2' => "审核中",'3' => "审核成功",'4' => "审核失败"5、
constructor(parcel: Parcel) : this() {
id = parcel.readString()
uid = parcel.readString()
type = parcel.readValue(Int::class.java.classLoader) as? Int
cashName = parcel.readString()
bankRealName = parcel.readString()
bankName = parcel.readString()
bankAddress = parcel.readString()
account = parcel.readString()
bankIcon = parcel.readString()
remark = parcel.readString()
isDefault = parcel.readInt()
status = parcel.readInt()
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(id)
parcel.writeString(uid)
parcel.writeValue(type)
parcel.writeString(cashName)
parcel.writeString(bankRealName)
parcel.writeString(bankName)
parcel.writeString(bankAddress)
parcel.writeString(account)
parcel.writeString(bankIcon)
parcel.writeString(remark)
parcel.writeInt(isDefault)
parcel.writeInt(status)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<AccountBean> {
override fun createFromParcel(parcel: Parcel): AccountBean {
return AccountBean(parcel)
}
override fun newArray(size: Int): Array<AccountBean?> {
return arrayOfNulls(size)
}
}
}
\ No newline at end of file
package com.yidianling.user.mine.fragment
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
import android.text.TextUtils
import com.yidianling.user.mine.ChooseAccountActivity
import com.ydl.ydlcommon.base.BaseFragment
import com.ydl.ydlcommon.data.http.RxUtils
import com.ydl.ydlcommon.data.http.ThrowableConsumer
import com.ydl.ydlcommon.utils.TransferCacheUtils
import com.yidianling.common.tools.ToastUtil
import com.yidianling.user.R
import com.yidianling.user.mine.bean.AddAccountCmd
import com.yidianling.user.mine.data.AppDataManager
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.user_mine_fragment_add_ali_account.*
/**
* 添加支付宝帐号
*/
class AddAliAccountFragment : BaseFragment() {
override fun layoutResId(): Int {
return R.layout.user_mine_fragment_add_ali_account
}
override fun initDataAndEvent() {
btn_ensure.setOnClickListener {
saveAccount()
}
}
/**
* 保存支付宝帐号
*/
@SuppressLint("CheckResult")
private fun saveAccount() {
var account = et_account.text.trim().toString()
if (TextUtils.isEmpty(account)) {
ToastUtil.toastShort("支付宝帐号不能为空")
return
}
var name = et_name.text.trim().toString()
if (TextUtils.isEmpty(name)) {
ToastUtil.toastShort("姓名不能为空")
return
}
var param = AddAccountCmd(name, account, "1")
// showProgressDialog("")
AppDataManager.getHttp().addAccount(param)
.compose(RxUtils.resultData())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
// dismissProgressDialog()
if (it == null) {
ToastUtil.toastShort("返回数据错误")
} else {
ToastUtil.toastShort("添加帐号成功")
var intent = Intent()
TransferCacheUtils.putTransferData(ChooseAccountActivity.ADD_ACCOUNT_REQUEST_CODE, it)
activity!!.setResult(Activity.RESULT_OK, intent)
activity!!.finish()
}
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
// dismissProgressDialog()
ToastUtil.toastShort(msg)
}
})
}
override fun initDataAndEventLazy() {
}
}
package com.yidianling.user.mine.fragment
import com.ydl.ydlcommon.base.BaseFragment
import com.yidianling.user.R
/**
* 添加银行卡(后续会增加添加银行卡功能,做成独立页面)
*/
class AddBankAccountFragment : BaseFragment() {
override fun layoutResId(): Int {
return R.layout.user_mine_fragment_add_bank_account
}
override fun initDataAndEvent() {
}
override fun initDataAndEventLazy() {
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yidianling.user.mine.AddAccountActivity">
<com.ydl.ydlcommon.view.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/title_bar_height"
app:pa_left_start_icon="@drawable/platform_common_back"
android:background="@color/platform_white"
app:pa_title_text="添加提现帐号" />
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<View
<LinearLayout
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
android:layout_height="match_parent"
android:orientation="vertical">
<com.ydl.ydlcommon.view.TitleBar
android:id="@+id/title_bar"
android:layout_width="match_parent"
android:layout_height="@dimen/title_bar_height"
app:pa_left_start_icon="@drawable/platform_common_back"
android:background="@color/platform_white"
app:pa_title_text="添加提现帐号" />
<com.ydl.ydlcommon.view.widgets.TopTabSelectLayout
android:id="@+id/top_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e5e5e5" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View style="@style/platform_viewline" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:layout_width="111dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="支付宝帐号"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_account"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@null"
android:inputType="textEmailAddress"
android:hint="请输入您的支付宝帐号"
android:textColor="@color/black"
android:textColorHint="@color/platform_color_999999"
android:textSize="17sp" />
</LinearLayout>
<View
style="@style/platform_viewline"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:layout_width="111dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="姓名"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@null"
android:hint="请输入您的姓名"
android:textColor="@color/black"
android:textColorHint="@color/platform_color_999999"
android:textSize="17sp" />
</LinearLayout>
<View style="@style/platform_viewline" />
<View
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.ydl.ydlcommon.view.RoundCornerButton
android:id="@+id/btn_ensure"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="28dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="保存"
android:textColor="@color/white"
android:textSize="16sp"
app:pa_round_btn_bg="@color/platform_main_theme"
app:pa_round_btn_radio_size="4dp" />
</LinearLayout>
</LinearLayout>
</layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yidianling.user.mine.fragment.AddAliAccountFragment">
<View style="@style/platform_viewline" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:layout_width="111dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="支付宝帐号"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_account"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@null"
android:inputType="textEmailAddress"
android:hint="请输入您的支付宝帐号"
android:textColor="@color/black"
android:textColorHint="@color/platform_color_999999"
android:textSize="17sp" />
</LinearLayout>
<View
style="@style/platform_viewline"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:layout_width="111dp"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="姓名"
android:textColor="@color/black"
android:textSize="17sp" />
<EditText
android:id="@+id/et_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@null"
android:hint="请输入您的姓名"
android:textColor="@color/black"
android:textColorHint="@color/platform_color_999999"
android:textSize="17sp" />
</LinearLayout>
<View style="@style/platform_viewline" />
<View
android:layout_width="1dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<com.ydl.ydlcommon.view.RoundCornerButton
android:id="@+id/btn_ensure"
style="?android:attr/borderlessButtonStyle"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginBottom="28dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:text="保存"
android:textColor="@color/white"
android:textSize="16sp"
app:pa_round_btn_bg="@color/platform_main_theme"
app:pa_round_btn_radio_size="4dp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="com.yidianling.user.mine.fragment.AddBankAccountFragment">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:src="@drawable/user_mine_img_yhk" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="26dp"
android:text="近期会持续开通提现到银行卡,敬请期待......"
android:textColor="@color/platform_color_999999"
android:textSize="15sp" />
</LinearLayout>
......@@ -829,6 +829,7 @@ public class NewH5Activity extends BaseActivity implements PtrHandler {
super.onReceivedError(view, errorCode, description, failingUrl);
AliYunRichLogsHelper.Companion.getInstance()
.sendRichLog(AliYunLogConfig.WEB, "onReceivedError---- errorCode: " + errorCode + "----failingUrl:" + failingUrl);
LogUtil.e("webviewErrorCode:" + errorCode + "description:" + description);
loadFailed = true;
tb_title.setTitle("加载中");
if (wv_content != null) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment