Commit 79079b9e by 徐健

Merge branch 'feature/consultant_update' into feature/v3

# Conflicts:
#	app/build.gradle
#	app/src/main/java/com/ydl/component/MainActivity.kt
#	config.gradle
#	m-user/src/main/java/com/yidianling/user/constants/UserBIConstants.kt
parents c53b4393 1002a61b
...@@ -183,10 +183,11 @@ dependencies { ...@@ -183,10 +183,11 @@ dependencies {
implementation project(':m-tests') implementation project(':m-tests')
implementation project(':m-consultant') implementation project(':m-consultant')
implementation modularPublication('com.ydl:m-consultant-api') implementation modularPublication('com.ydl:m-consultant-api')
implementation project(':m-confide') // implementation project(':m-confide')
api project(':m-home') api project(':m-home')
// api project(':m-confide')
// api "com.ydl:m-consultant-api:0.0.2" // api "com.ydl:m-consultant-api:0.0.2"
// api 'com.ydl:m-consultant-module-ydl:0.0.18@aar' // api 'com.ydl:m-consultant-module-ydl:0.0.18@aar'
...@@ -201,7 +202,7 @@ dependencies { ...@@ -201,7 +202,7 @@ dependencies {
implementation project(':m-muse') // implementation project(':m-muse')
implementation project(':m-im') implementation project(':m-im')
implementation project(':m-dynamic') implementation project(':m-dynamic')
......
...@@ -10,6 +10,7 @@ import android.net.Uri ...@@ -10,6 +10,7 @@ import android.net.Uri
import android.os.IBinder import android.os.IBinder
import android.provider.Settings import android.provider.Settings
import android.util.Log import android.util.Log
import android.widget.LinearLayout
import com.alibaba.android.arouter.launcher.ARouter import com.alibaba.android.arouter.launcher.ARouter
import com.tbruyelle.rxpermissions2.RxPermissions import com.tbruyelle.rxpermissions2.RxPermissions
import com.umeng.analytics.MobclickAgent import com.umeng.analytics.MobclickAgent
...@@ -17,6 +18,7 @@ import com.ydl.component.home.HomeActivity ...@@ -17,6 +18,7 @@ import com.ydl.component.home.HomeActivity
import com.ydl.component.music.FragmentContainerActivity import com.ydl.component.music.FragmentContainerActivity
import com.ydl.component.mvp.DemoContract import com.ydl.component.mvp.DemoContract
import com.ydl.component.mvp.DemoPresenter import com.ydl.component.mvp.DemoPresenter
//import com.ydl.confide.home.ConfideHomeActivity
import com.ydl.media.audio.PlayService import com.ydl.media.audio.PlayService
import com.ydl.ydl_router.manager.YDLRouterManager import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydl_router.manager.YDLRouterParams import com.ydl.ydl_router.manager.YDLRouterParams
......
...@@ -190,6 +190,6 @@ ...@@ -190,6 +190,6 @@
<com.ydl.ydlcommon.mvp.lce.view.YDLStateView <com.ydl.ydlcommon.mvp.lce.view.YDLStateView
android:id="@+id/lce_state_view" android:id="@+id/lce_state_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="300dp" /> android:layout_height="30dp" />
</LinearLayout> </LinearLayout>
\ No newline at end of file
...@@ -43,18 +43,19 @@ ext { ...@@ -43,18 +43,19 @@ ext {
// -------------- 业务模块 -------------- // -------------- 业务模块 --------------
//第三步 若干 //第三步 若干
"m-confide" : "0.0.40.2", "m-confide" : "0.0.41.1",
"m-consultant" : "0.0.50.2", "m-consultant" : "0.0.51.1",
"m-fm" : "0.0.23.2", "m-fm" : "0.0.23.3",
"m-user" : "0.0.40.2", "m-user" : "0.0.40.3",
"m-home" : "0.0.6.5", "m-home" : "0.0.6.6",
"m-muse" : "0.0.20.2", "m-muse" : "0.0.20.3",
"m-tests" : "0.0.15.2", "m-tests" : "0.0.15.2",
"m-course" : "0.0.34.2", "m-course" : "0.0.34.3",
"m-im" : "0.0.3.1", "m-im" : "0.0.3.1",
"m-dynamic" : "0.0.1.1", "m-dynamic" : "0.0.1.1",
//-------------- 业务模块 API 层 -------------- //-------------- 业务模块 API 层 --------------
"m-audioim-api" : "0.0.5", "m-audioim-api" : "0.0.5",
"m-confide-api" : "0.0.1.1", "m-confide-api" : "0.0.1.1",
...@@ -89,7 +90,7 @@ ext { ...@@ -89,7 +90,7 @@ ext {
// -------------- 业务模块 -------------- // -------------- 业务模块 --------------
//第三步 若干 //第三步 若干
"m-confide" : "0.0.40", "m-confide" : "0.0.40",
"m-consultant" : "0.0.26", "m-consultant" : "0.0.28",
"m-course" : "0.0.22", "m-course" : "0.0.22",
"m-fm" : "0.0.15", "m-fm" : "0.0.15",
"m-user" : "0.0.25", "m-user" : "0.0.25",
......
...@@ -163,6 +163,8 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi ...@@ -163,6 +163,8 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi
//频道管理器 //频道管理器
private var channelManager : ChannelManager? = null private var channelManager : ChannelManager? = null
private var isLeavelChannel:Boolean = false
/** /**
* 声网事件回调 (SDK 通过指定的事件通知应用程序 SDK 的运行事件,如: 加入或离开频道,新用户加入频道等) * 声网事件回调 (SDK 通过指定的事件通知应用程序 SDK 的运行事件,如: 加入或离开频道,新用户加入频道等)
*/ */
...@@ -917,7 +919,7 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi ...@@ -917,7 +919,7 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi
channelId channelId
) )
var cmd = NoticePushCommand() var cmd = NoticePushCommand()
cmd.data = Gson().toJson(msgBean) cmd.data = msgBean
cmd.pushId = listenerUid cmd.pushId = listenerUid
if (isCall) { if (isCall) {
cmd.status = "CALL" cmd.status = "CALL"
...@@ -932,11 +934,14 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi ...@@ -932,11 +934,14 @@ class AudioHomeActivity : BaseMvpActivity<IAudioHomeActivityContract.View, IAudi
* 声网离开频道 * 声网离开频道
*/ */
private fun leaveChannel() { private fun leaveChannel() {
//刷新h5页面 if (!isLeavelChannel) {
EventBus.getDefault().post(RefreshWebEvent(false)) isLeavelChannel = true
stopPlaying() //刷新h5页面
//播放结束音频 EventBus.getDefault().post(RefreshWebEvent(false))
playFinishMusic() stopPlaying()
//播放结束音频
playFinishMusic()
}
} }
override fun onResume() { override fun onResume() {
......
...@@ -50,7 +50,8 @@ interface AudioNetAPi { ...@@ -50,7 +50,8 @@ interface AudioNetAPi {
/** /**
*通知服务端发送推送 *通知服务端发送推送
*/ */
@POST("api/push/notify/doctor") @Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@POST("push/notify/doctor")
fun noticeServerPush(@Body body: RequestBody): Observable<BaseResponse<Any>> fun noticeServerPush(@Body body: RequestBody): Observable<BaseResponse<Any>>
/** /**
......
package com.ydl.audioim.http.command; package com.ydl.audioim.http.command;
import com.ydl.ydl_av.chat.bean.AudioMessageBean;
import com.ydl.ydlcommon.data.http.BaseCommand; import com.ydl.ydlcommon.data.http.BaseCommand;
/** /**
...@@ -11,7 +12,7 @@ import com.ydl.ydlcommon.data.http.BaseCommand; ...@@ -11,7 +12,7 @@ import com.ydl.ydlcommon.data.http.BaseCommand;
* @date 2018/11/17 * @date 2018/11/17
*/ */
public class NoticePushCommand extends BaseCommand { public class NoticePushCommand extends BaseCommand {
public String data;//AudioMessageBean的字符串 public AudioMessageBean data;//AudioMessageBean的字符串
public String pushId;//专家uid public String pushId;//专家uid
public String status;//CALL 呼叫 CALL_OFF 取消呼叫 public String status;//CALL 呼叫 CALL_OFF 取消呼叫
public String title = "您有一条倾诉消息"; public String title = "您有一条倾诉消息";
......
...@@ -28,17 +28,14 @@ import com.ydl.webview.NewH5Activity ...@@ -28,17 +28,14 @@ import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.config.SimpleImageOpConfiger import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener
import com.ydl.ydl_image.manager.YDLImageCacheManager import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydlcommon.base.BaseMvpActivity import com.ydl.ydlcommon.base.BaseMvpActivity
import com.ydl.ydlcommon.base.config.HttpConfig import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.bean.StatusBarOptions import com.ydl.ydlcommon.bean.StatusBarOptions
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.ui.LogoLoadingView import com.ydl.ydlcommon.ui.LogoLoadingView
import com.ydl.ydlcommon.utils.BuryPointUtils import com.ydl.ydlcommon.utils.BuryPointUtils
import com.ydl.ydlcommon.utils.StatusBarUtils import com.ydl.ydlcommon.utils.StatusBarUtils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.banner.GlideImageLoader
import com.ydl.ydlcommon.view.listener.EndlessRecyclerViewScrollListener import com.ydl.ydlcommon.view.listener.EndlessRecyclerViewScrollListener
import com.yidianling.common.tools.LogUtil import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxDeviceTool import com.yidianling.common.tools.RxDeviceTool
...@@ -51,7 +48,6 @@ import com.yidianling.consultant.listener.OnFilterConfirmListener ...@@ -51,7 +48,6 @@ import com.yidianling.consultant.listener.OnFilterConfirmListener
import com.yidianling.consultant.listener.OnSortItemSelectedListener import com.yidianling.consultant.listener.OnSortItemSelectedListener
import com.yidianling.consultant.model.bean.* import com.yidianling.consultant.model.bean.*
import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils
import com.yidianling.consultant.modular.utils.TempH5RouteUtils
import com.yidianling.consultant.router.ConsultantIn import com.yidianling.consultant.router.ConsultantIn
import com.yidianling.consultant.ui.view.AreaPopupWindow import com.yidianling.consultant.ui.view.AreaPopupWindow
import com.yidianling.consultant.ui.view.CategoryPopupWindow import com.yidianling.consultant.ui.view.CategoryPopupWindow
...@@ -60,7 +56,6 @@ import com.yidianling.consultant.ui.view.SortPopupWindow ...@@ -60,7 +56,6 @@ import com.yidianling.consultant.ui.view.SortPopupWindow
import kotlinx.android.synthetic.main.consultant_activity_expert_search_list.* 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_item_filter_online.view.*
import kotlinx.android.synthetic.main.consultant_layout_search_content.* import kotlinx.android.synthetic.main.consultant_layout_search_content.*
import kotlinx.android.synthetic.main.consultant_layout_search_head_bg.*
import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.* import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.*
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.Executors import java.util.concurrent.Executors
...@@ -227,11 +222,15 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -227,11 +222,15 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
super.onScrollStateChanged(recyclerView, newState) super.onScrollStateChanged(recyclerView, newState)
hideSoftInput() hideSoftInput()
if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) {
//滚动
ConsultAssistantDialogUtils.INSTANCE.hideAssistantActivity()
sIsScrolling = true sIsScrolling = true
if (!this@ExpertSearchActivity.isFinishing) { if (!this@ExpertSearchActivity.isFinishing) {
// GlideApp.with(this@ExpertSearchActivity).pauseRequests() // GlideApp.with(this@ExpertSearchActivity).pauseRequests()
} }
} else if (newState == RecyclerView.SCROLL_STATE_IDLE) { } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//没有滚动
ConsultAssistantDialogUtils.INSTANCE.fitRequest(this@ExpertSearchActivity, "doctor_list", true)
if (sIsScrolling) { if (sIsScrolling) {
if (!this@ExpertSearchActivity.isFinishing) { if (!this@ExpertSearchActivity.isFinishing) {
// GlideApp.with(this@ExpertSearchActivity).resumeRequests() // GlideApp.with(this@ExpertSearchActivity).resumeRequests()
...@@ -363,8 +362,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -363,8 +362,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
getPresenter().fetchListHead() getPresenter().fetchListHead()
//加载本地缓存数据 //加载本地缓存数据
getPresenter().localData(initShowType) getPresenter().localData(initShowType)
//加载banner
getPresenter().fetchBannerList()
refresh(false) refresh(false)
v_loading.visibility = View.VISIBLE v_loading.visibility = View.VISIBLE
...@@ -375,34 +372,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -375,34 +372,6 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
} }
} }
override fun onBannerListFetched(data: MutableList<ExpertBannerBean>?) {
if (null == data) {
if (bannerList.isEmpty()) {
bannerList.add("https://h2.yidianling.com/ct/list")
}
}
if (null != data && data.isNotEmpty()) {
bannerList.clear()
for (item in data) {
bannerList.add(item.image!!)
}
}
banner_search.setOnBannerListener {
if (null == data || data.isEmpty()) {
TempH5RouteUtils.tempH5Route(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, "https://h2.yidianling.com/ct/list"), "")
} else {
if (it < data.size) {
TempH5RouteUtils.tempH5Route(data[it].linkUrl)
}
}
}
banner_search.setImageLoader(GlideImageLoader(R.drawable.consultant_expert_banner_default)).setImages(bannerList).start()
banner_search.setIndicatorBottomPadding(20)
}
override fun onNewIntent(intent: Intent?) { override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent) super.onNewIntent(intent)
initData(intent!!) initData(intent!!)
...@@ -1003,7 +972,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres ...@@ -1003,7 +972,7 @@ class ExpertSearchActivity : BaseMvpActivity<IExpertSearchView, ExpertSearchPres
} }
filterPopupWindow.isClippingEnabled = false filterPopupWindow.isClippingEnabled = false
filterPopupWindow.showAtLocation(viewSep2.rootView, Gravity.TOP + Gravity.RIGHT, 0, 0) filterPopupWindow.showAtLocation(viewSep2.rootView, Gravity.TOP + Gravity.RIGHT, 0, 0)
ConsultAssistantDialogUtils.INSTANCE.hide() ConsultAssistantDialogUtils.INSTANCE.hideAssistantActivity()
filterPopupWindow.onFilterConfirmListener = this filterPopupWindow.onFilterConfirmListener = this
updateFilterTextViewStatus(tvFilter, FILTER_STATUS_OPEN) updateFilterTextViewStatus(tvFilter, FILTER_STATUS_OPEN)
// viewDim.visibility = View.VISIBLE // viewDim.visibility = View.VISIBLE
......
...@@ -24,17 +24,14 @@ import com.ydl.webview.NewH5Activity ...@@ -24,17 +24,14 @@ import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.config.SimpleImageOpConfiger import com.ydl.ydl_image.config.SimpleImageOpConfiger
import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener import com.ydl.ydl_image.listener.YDLImageRecyclerOnScrollListener
import com.ydl.ydl_image.manager.YDLImageCacheManager import com.ydl.ydl_image.manager.YDLImageCacheManager
import com.ydl.ydl_router.manager.YDLRouterParams
import com.ydl.ydlcommon.base.BaseMvpFragment import com.ydl.ydlcommon.base.BaseMvpFragment
import com.ydl.ydlcommon.base.config.HttpConfig import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.router.IYDLRouterConstant
import com.ydl.ydlcommon.ui.LogoLoadingView import com.ydl.ydlcommon.ui.LogoLoadingView
import com.ydl.ydlcommon.utils.BuryPointUtils import com.ydl.ydlcommon.utils.BuryPointUtils
import com.ydl.ydlcommon.utils.DisplayUtils import com.ydl.ydlcommon.utils.DisplayUtils
import com.ydl.ydlcommon.utils.StatusBarUtils import com.ydl.ydlcommon.utils.StatusBarUtils
import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils import com.ydl.ydlcommon.utils.actionutil.ActionCountUtils
import com.ydl.ydlcommon.utils.remind.ToastHelper import com.ydl.ydlcommon.utils.remind.ToastHelper
import com.ydl.ydlcommon.view.banner.GlideImageLoader
import com.ydl.ydlcommon.view.listener.EndlessRecyclerViewScrollListener import com.ydl.ydlcommon.view.listener.EndlessRecyclerViewScrollListener
import com.yidianling.common.tools.LogUtil import com.yidianling.common.tools.LogUtil
import com.yidianling.common.tools.RxDeviceTool import com.yidianling.common.tools.RxDeviceTool
...@@ -47,7 +44,6 @@ import com.yidianling.consultant.listener.OnFilterConfirmListener ...@@ -47,7 +44,6 @@ import com.yidianling.consultant.listener.OnFilterConfirmListener
import com.yidianling.consultant.listener.OnSortItemSelectedListener import com.yidianling.consultant.listener.OnSortItemSelectedListener
import com.yidianling.consultant.model.bean.* import com.yidianling.consultant.model.bean.*
import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils
import com.yidianling.consultant.modular.utils.TempH5RouteUtils
import com.yidianling.consultant.router.ConsultantIn import com.yidianling.consultant.router.ConsultantIn
import com.yidianling.consultant.ui.view.AreaPopupWindow import com.yidianling.consultant.ui.view.AreaPopupWindow
import com.yidianling.consultant.ui.view.CategoryPopupWindow import com.yidianling.consultant.ui.view.CategoryPopupWindow
...@@ -56,7 +52,6 @@ import com.yidianling.consultant.ui.view.SortPopupWindow ...@@ -56,7 +52,6 @@ import com.yidianling.consultant.ui.view.SortPopupWindow
import kotlinx.android.synthetic.main.consultant_activity_expert_search_list.* 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_item_filter_online.view.*
import kotlinx.android.synthetic.main.consultant_layout_search_content.* import kotlinx.android.synthetic.main.consultant_layout_search_content.*
import kotlinx.android.synthetic.main.consultant_layout_search_head_bg.*
import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.* import kotlinx.android.synthetic.main.consultant_layout_search_toolbar.*
import org.json.JSONObject import org.json.JSONObject
import java.util.concurrent.Executors import java.util.concurrent.Executors
...@@ -84,15 +79,21 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres ...@@ -84,15 +79,21 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
} }
override fun showImage(url: String?, imgView: ImageView) { override fun showImage(url: String?, imgView: ImageView) {
YDLImageCacheManager.showImage(activity, url, imgView) if (isAdded) {
YDLImageCacheManager.showImage(activity, url, imgView)
}
} }
override fun showImage(url: String?, imgView: ImageView, ops: SimpleImageOpConfiger) { override fun showImage(url: String?, imgView: ImageView, ops: SimpleImageOpConfiger) {
YDLImageCacheManager.showImage(activity, url, imgView, ops) if (isAdded) {
YDLImageCacheManager.showImage(activity, url, imgView, ops)
}
} }
override fun showImage(url: String?, imgView: ImageView, width: Int, heigh: Int, ops: SimpleImageOpConfiger) { override fun showImage(url: String?, imgView: ImageView, width: Int, heigh: Int, ops: SimpleImageOpConfiger) {
YDLImageCacheManager.showImage(activity, url, imgView, width, heigh, ops) if (isAdded) {
YDLImageCacheManager.showImage(activity, url, imgView, width, heigh, ops)
}
} }
// //
// override fun getStatusViewOptions(): StatusBarOptions { // override fun getStatusViewOptions(): StatusBarOptions {
...@@ -180,8 +181,12 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres ...@@ -180,8 +181,12 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
hideSoftInput() hideSoftInput()
if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) {
sIsScrolling = true sIsScrolling = true
//滚动
hideConsultAssistantDialog()
} else if (newState == RecyclerView.SCROLL_STATE_IDLE) { } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//没有滚动
showConsultAssistantDialog()
if (sIsScrolling) { if (sIsScrolling) {
} }
...@@ -313,8 +318,6 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres ...@@ -313,8 +318,6 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
getPresenter().fetchListHead() getPresenter().fetchListHead()
//加载本地缓存数据 //加载本地缓存数据
getPresenter().localData(initShowType) getPresenter().localData(initShowType)
//加载banner
getPresenter().fetchBannerList()
//refresh(false) //refresh(false)
v_loading.visibility = View.VISIBLE v_loading.visibility = View.VISIBLE
...@@ -325,35 +328,6 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres ...@@ -325,35 +328,6 @@ class ExpertSearchFragment : BaseMvpFragment<IExpertSearchView, ExpertSearchPres
} }
} }
override fun onBannerListFetched(data: MutableList<ExpertBannerBean>?) {
if (null == data) {
if (bannerList.isEmpty()) {
bannerList.add("https://h2.yidianling.com/ct/list")
}
}
if (null != data && data.isNotEmpty()) {
bannerList.clear()
for (item in data) {
bannerList.add(item.image!!)
}
}
banner_search.setOnBannerListener {
if (null == data || data.isEmpty()) {
TempH5RouteUtils.tempH5Route(
IYDLRouterConstant.ROUTER_H5_H5,
YDLRouterParams().putExtra(IYDLRouterConstant.EXTRA_URL, "https://h2.yidianling.com/ct/list"), "")
} else {
if (it < data.size) {
TempH5RouteUtils.tempH5Route(data[it].linkUrl)
}
}
}
banner_search.setImageLoader(GlideImageLoader(R.drawable.consultant_expert_banner_default)).setImages(bannerList).start()
banner_search.setIndicatorBottomPadding(20)
}
/** /**
* 初始化状态栏位置 * 初始化状态栏位置
*/ */
......
...@@ -42,26 +42,6 @@ class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() { ...@@ -42,26 +42,6 @@ class ExpertSearchPresenter : SimplePresenter<IExpertSearchView>() {
}) })
} }
@SuppressLint("CheckResult")
fun fetchBannerList() {
ExpertSearchDataManager.getHttp().getBannerList()
.subscribeOn(Schedulers.io())
.compose(RxLifecycleUtils.bindToLifecycle(mView!!))
.compose(RxUtils.resultJavaData())
.map { it }
.filter { it != null }
.observeOn(AndroidSchedulers.mainThread())
.subscribe(Consumer {
mView.onBannerListFetched(it)
}, object : ThrowableConsumer() {
override fun accept(msg: String) {
mView.onBannerListFetched(null)
// mView.fetchFailed(msg)
}
})
}
/** /**
* 加载缓存 * 加载缓存
*/ */
......
...@@ -23,7 +23,6 @@ interface IExpertSearchView : IView { ...@@ -23,7 +23,6 @@ interface IExpertSearchView : IView {
fun fetchFailed(msg: String?) fun fetchFailed(msg: String?)
fun fetchListFailed(msg: String?) fun fetchListFailed(msg: String?)
fun fetchListEmpty(msg: String?) fun fetchListEmpty(msg: String?)
fun onBannerListFetched(data: MutableList<ExpertBannerBean>?)
/** /**
* 加载图片 * 加载图片
*/ */
......
package com.yidianling.consultant.bean;
import java.util.List;
public class ExpertSearchBigShotBean {
/**
* id : 62
* specialTopicName : 1
* specialTopicType : 2
* specialTopicTitle : 大咖专场1
* specialTopicSubhead : 副标题1
* status : 0
* weight : 2
* jumpWay : 2
* createTime : Dec 13, 2019 9:56:26 PM
* updateTime : Dec 16, 2019 5:05:36 PM
* createrId : 22
* specialTopicUrl : https://testh2.yidianling.com/post/view-out/139?last_source=app
* topicImages : [{"id":88,"parentId":62,"iamgeType":2,"isShow":1,"createTime":"Dec 13, 2019 9:35:45 PM","updateTime":"Dec 16, 2019 4:31:42 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"},{"id":133,"parentId":62,"iamgeType":1,"isShow":1,"createTime":"Dec 16, 2019 4:23:00 PM","updateTime":"Dec 16, 2019 4:34:48 PM","createrId":0,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"},{"id":134,"parentId":62,"iamgeType":1,"isShow":1,"createTime":"Dec 16, 2019 4:28:03 PM","updateTime":"Dec 16, 2019 4:29:58 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"},{"id":146,"parentId":62,"iamgeType":3,"isShow":1,"createTime":"Dec 16, 2019 4:32:15 PM","updateTime":"Dec 16, 2019 4:34:01 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"}]
*/
private int id;
private String specialTopicName;
private int specialTopicType;
private String specialTopicTitle;
private String specialTopicSubhead;
private int status;
private int weight;
private int jumpWay;
private String createTime;
private String updateTime;
private int createrId;
private String specialTopicUrl;
private List<TopicImagesBean> topicImages;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSpecialTopicName() {
return specialTopicName;
}
public void setSpecialTopicName(String specialTopicName) {
this.specialTopicName = specialTopicName;
}
public int getSpecialTopicType() {
return specialTopicType;
}
public void setSpecialTopicType(int specialTopicType) {
this.specialTopicType = specialTopicType;
}
public String getSpecialTopicTitle() {
return specialTopicTitle;
}
public void setSpecialTopicTitle(String specialTopicTitle) {
this.specialTopicTitle = specialTopicTitle;
}
public String getSpecialTopicSubhead() {
return specialTopicSubhead;
}
public void setSpecialTopicSubhead(String specialTopicSubhead) {
this.specialTopicSubhead = specialTopicSubhead;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getJumpWay() {
return jumpWay;
}
public void setJumpWay(int jumpWay) {
this.jumpWay = jumpWay;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public int getCreaterId() {
return createrId;
}
public void setCreaterId(int createrId) {
this.createrId = createrId;
}
public String getSpecialTopicUrl() {
return specialTopicUrl;
}
public void setSpecialTopicUrl(String specialTopicUrl) {
this.specialTopicUrl = specialTopicUrl;
}
public List<TopicImagesBean> getTopicImages() {
return topicImages;
}
public void setTopicImages(List<TopicImagesBean> topicImages) {
this.topicImages = topicImages;
}
public static class TopicImagesBean {
/**
* id : 88
* parentId : 62
* iamgeType : 2
* isShow : 1
* createTime : Dec 13, 2019 9:35:45 PM
* updateTime : Dec 16, 2019 4:31:42 PM
* createrId : 1
* imageUrl : https://pic.ydlcdn.com/6n5AcChhYa.png
*/
private int id;
private int parentId;
private int iamgeType;
private int isShow;
private String createTime;
private String updateTime;
private int createrId;
private String imageUrl;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public int getIamgeType() {
return iamgeType;
}
public void setIamgeType(int iamgeType) {
this.iamgeType = iamgeType;
}
public int getIsShow() {
return isShow;
}
public void setIsShow(int isShow) {
this.isShow = isShow;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public int getCreaterId() {
return createrId;
}
public void setCreaterId(int createrId) {
this.createrId = createrId;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
}
package com.yidianling.consultant.bean;
import java.util.List;
public class ExpertSearchRecommandBean {
/**
* id : 68
* specialTopicName : 3
* specialTopicType : 1
* specialTopicTitle : 婚姻幸福
* specialTopicSubhead : 副标题副标题1
* status : 0
* weight : 1
* jumpWay : 1
* createTime : Dec 13, 2019 9:35:47 PM
* updateTime : Dec 16, 2019 5:44:47 PM
* createrId : 11
* specialTopicUrl : https://testh2.yidianling.com/post/view-out/139?last_source=app
* topicImages : [{"id":103,"parentId":68,"iamgeType":2,"isShow":1,"createTime":"Dec 13, 2019 9:35:47 PM","updateTime":"Dec 16, 2019 4:31:55 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"},{"id":140,"parentId":68,"iamgeType":1,"isShow":1,"createTime":"Dec 16, 2019 4:28:05 PM","updateTime":"Dec 16, 2019 4:30:13 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"},{"id":152,"parentId":68,"iamgeType":3,"isShow":1,"createTime":"Dec 16, 2019 4:32:18 PM","updateTime":"Dec 16, 2019 4:34:15 PM","createrId":1,"imageUrl":"https://pic.ydlcdn.com/6n5AcChhYa.png"}]
*/
private int id;
private String specialTopicName;
private int specialTopicType;
private String specialTopicTitle;
private String specialTopicSubhead;
private int status;
private int weight;
private int jumpWay;
private String createTime;
private String updateTime;
private int createrId;
private String specialTopicUrl;
private List<TopicImagesBean> topicImages;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getSpecialTopicName() {
return specialTopicName;
}
public void setSpecialTopicName(String specialTopicName) {
this.specialTopicName = specialTopicName;
}
public int getSpecialTopicType() {
return specialTopicType;
}
public void setSpecialTopicType(int specialTopicType) {
this.specialTopicType = specialTopicType;
}
public String getSpecialTopicTitle() {
return specialTopicTitle;
}
public void setSpecialTopicTitle(String specialTopicTitle) {
this.specialTopicTitle = specialTopicTitle;
}
public String getSpecialTopicSubhead() {
return specialTopicSubhead;
}
public void setSpecialTopicSubhead(String specialTopicSubhead) {
this.specialTopicSubhead = specialTopicSubhead;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getJumpWay() {
return jumpWay;
}
public void setJumpWay(int jumpWay) {
this.jumpWay = jumpWay;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public int getCreaterId() {
return createrId;
}
public void setCreaterId(int createrId) {
this.createrId = createrId;
}
public String getSpecialTopicUrl() {
return specialTopicUrl;
}
public void setSpecialTopicUrl(String specialTopicUrl) {
this.specialTopicUrl = specialTopicUrl;
}
public List<TopicImagesBean> getTopicImages() {
return topicImages;
}
public void setTopicImages(List<TopicImagesBean> topicImages) {
this.topicImages = topicImages;
}
public static class TopicImagesBean {
/**
* id : 103
* parentId : 68
* iamgeType : 2
* isShow : 1
* createTime : Dec 13, 2019 9:35:47 PM
* updateTime : Dec 16, 2019 4:31:55 PM
* createrId : 1
* imageUrl : https://pic.ydlcdn.com/6n5AcChhYa.png
*/
private int id;
private int parentId;
private int iamgeType;
private int isShow;
private String createTime;
private String updateTime;
private int createrId;
private String imageUrl;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getParentId() {
return parentId;
}
public void setParentId(int parentId) {
this.parentId = parentId;
}
public int getIamgeType() {
return iamgeType;
}
public void setIamgeType(int iamgeType) {
this.iamgeType = iamgeType;
}
public int getIsShow() {
return isShow;
}
public void setIsShow(int isShow) {
this.isShow = isShow;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public int getCreaterId() {
return createrId;
}
public void setCreaterId(int createrId) {
this.createrId = createrId;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
}
package com.yidianling.consultant.bean
class ExpertSearchTopShowBean (
var doctorSpecialTopics: ArrayList<ExpertSearchBigShotBean>,
var sceneSpecialTopic: ArrayList<ExpertSearchRecommandBean>
)
package com.yidianling.consultant.dialog package com.yidianling.consultant.dialog
import android.animation.Animator
import android.animation.ObjectAnimator
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.view.Gravity import android.view.Gravity
import android.view.View
import android.view.WindowManager import android.view.WindowManager
import com.ydl.ydlcommon.utils.SharedPreferencesEditor
import com.yidianling.common.tools.RxImageTool
import com.yidianling.consultant.R import com.yidianling.consultant.R
import com.yidianling.consultant.modular.singlton.ConsultAssistantDialogUtils
import kotlinx.android.synthetic.main.consultant_expert_consult_assistant_popup_window.* import kotlinx.android.synthetic.main.consultant_expert_consult_assistant_popup_window.*
/** /**
...@@ -14,7 +21,13 @@ import kotlinx.android.synthetic.main.consultant_expert_consult_assistant_popup_ ...@@ -14,7 +21,13 @@ import kotlinx.android.synthetic.main.consultant_expert_consult_assistant_popup_
* Created by xj on 2019/10/30. * Created by xj on 2019/10/30.
*/ */
class ConsultAssistantDialog(context: Context, val consultAssistantClickListener: OnConsultAssistantClickListener?) : Dialog(context, R.style.consultant_expert_dialog_default_style) { class ConsultAssistantDialog(
mContext: Context,
val consultAssistantClickListener: OnConsultAssistantClickListener?
) : Dialog(mContext, R.style.consultant_expert_dialog_default_style) {
private var animate: ObjectAnimator? = null
private var minWidth: Int? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
...@@ -31,14 +44,87 @@ class ConsultAssistantDialog(context: Context, val consultAssistantClickListener ...@@ -31,14 +44,87 @@ class ConsultAssistantDialog(context: Context, val consultAssistantClickListener
window.setWindowAnimations(R.style.consultant_expert_consult_assistant_dialog_animate) window.setWindowAnimations(R.style.consultant_expert_consult_assistant_dialog_animate)
consult_assistant.setOnClickListener { if (!ConsultAssistantDialogUtils.INSTANCE.canShowDesc()) {
consultant_assistant_dialog_desc_ll.visibility = View.GONE
consultant_assistant_dialog_desc_outside_ll.visibility = View.GONE
refreshDialogLayout(ConsultAssistantDialogUtils.INSTANCE.minWidth)
}
consultant_assistant_dialog_close.setOnClickListener {
if (minWidth == null) {
minWidth = (consultant_assistant.measuredWidth * 1.5).toInt()
}
ConsultAssistantDialogUtils.INSTANCE.minWidth = minWidth!!
//一个dialog关闭左侧desc,所有导医左侧desc都关闭
SharedPreferencesEditor.putString(
ConsultAssistantDialogUtils.INSTANCE.ASSISTANT_DIALOG_SP_TAG,
System.currentTimeMillis().toString()
)
animate = ObjectAnimator.ofFloat(
consultant_assistant_dialog_desc_ll,
"translationX",
0.0f,
consultant_assistant_dialog_desc_ll.measuredWidth.toFloat()
)
animate?.setDuration(900)?.start()
animate?.addListener(object : Animator.AnimatorListener {
override fun onAnimationRepeat(animation: Animator?) {
}
override fun onAnimationEnd(animation: Animator?) {
ConsultAssistantDialogUtils.INSTANCE.setDescHide()
hide()
// show()
Handler().postDelayed({
show()
}, 10)
}
override fun onAnimationCancel(animation: Animator?) {
}
override fun onAnimationStart(animation: Animator?) {
}
})
}
consultant_assistant.setOnClickListener {
consultAssistantClickListener?.onClickAction() consultAssistantClickListener?.onClickAction()
} }
setCanceledOnTouchOutside(false) setCanceledOnTouchOutside(false)
} }
public fun setDescHide() {
if (null != consultant_assistant_dialog_desc_ll) {
consultant_assistant_dialog_desc_ll.visibility = View.GONE
consultant_assistant_dialog_desc_outside_ll.visibility = View.GONE
refreshDialogLayout(ConsultAssistantDialogUtils.INSTANCE.minWidth)
}
}
// 刷新dialog布局,减小拦截点击区域
fun refreshDialogLayout(width: Int) {
val params = window.attributes
if (width != 0) {
minWidth = width
} else {
minWidth = (RxImageTool.dp2px(60f) * 1.5).toInt()
}
params.width = minWidth!!
params.height = WindowManager.LayoutParams.WRAP_CONTENT
params.gravity = Gravity.RIGHT + Gravity.BOTTOM
params.verticalMargin = 0.07f
params.horizontalMargin = 0.01f
window.setWindowAnimations(0)
window.attributes = params
}
interface OnConsultAssistantClickListener { interface OnConsultAssistantClickListener {
fun onClickAction() //隐私设置 fun onClickAction()
} }
} }
\ No newline at end of file
...@@ -3,6 +3,7 @@ package com.yidianling.consultant.http ...@@ -3,6 +3,7 @@ package com.yidianling.consultant.http
import com.ydl.ydlcommon.base.config.HttpConfig import com.ydl.ydlcommon.base.config.HttpConfig
import com.ydl.ydlcommon.data.http.BaseAPIResponse import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlnet.YDLHttpUtils import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.consultant.bean.ExpertSearchTopShowBean
import com.yidianling.consultant.model.SearchApi import com.yidianling.consultant.model.SearchApi
import com.yidianling.consultant.model.bean.ExpertBannerBean import com.yidianling.consultant.model.bean.ExpertBannerBean
import com.yidianling.consultant.model.bean.ExpertSearchBean import com.yidianling.consultant.model.bean.ExpertSearchBean
...@@ -49,8 +50,8 @@ class ExpertSearchHttpImpl : IExpertSearchHttp { ...@@ -49,8 +50,8 @@ class ExpertSearchHttpImpl : IExpertSearchHttp {
} }
override fun getBannerList(): Observable<BaseAPIResponse<MutableList<ExpertBannerBean>>> { override fun getBigShotData(): Observable<BaseAPIResponse<ExpertSearchTopShowBean>> {
return getSearchApi().expertBannerList() return getSearchApi().getBigShotData()
} }
......
package com.yidianling.consultant.http package com.yidianling.consultant.http
import com.ydl.ydlcommon.data.http.BaseAPIResponse import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.yidianling.consultant.bean.ExpertSearchTopShowBean
import com.yidianling.consultant.model.bean.ExpertBannerBean import com.yidianling.consultant.model.bean.ExpertBannerBean
import com.yidianling.consultant.model.bean.ExpertSearchBean import com.yidianling.consultant.model.bean.ExpertSearchBean
import io.reactivex.Observable import io.reactivex.Observable
...@@ -19,12 +20,13 @@ interface IExpertSearchHttp{ ...@@ -19,12 +20,13 @@ interface IExpertSearchHttp{
fun searchDoctor(params : String?): Observable<BaseAPIResponse<ExpertSearchBean>> fun searchDoctor(params : String?): Observable<BaseAPIResponse<ExpertSearchBean>>
/** /**
* 专家首页banner * 获取当前筛选条件结果数
*/ */
fun getBannerList(): Observable<BaseAPIResponse<MutableList<ExpertBannerBean>>> fun getFilterCount(params:String?): Observable<BaseAPIResponse<Int>>
/** /**
* 获取当前筛选条件结果数 * 获取大咖专区和顶部推荐数据数据
*/ */
fun getFilterCount(params:String?): Observable<BaseAPIResponse<Int>> fun getBigShotData(): Observable<BaseAPIResponse<ExpertSearchTopShowBean>>
} }
\ No newline at end of file
...@@ -6,6 +6,7 @@ import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA ...@@ -6,6 +6,7 @@ import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.http.BaseAPIResponse import com.ydl.ydlcommon.data.http.BaseAPIResponse
import com.ydl.ydlcommon.data.http.BaseResponse import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlnet.YDLHttpUtils import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.consultant.bean.ExpertSearchTopShowBean
import com.yidianling.consultant.bean.HotSearchBean import com.yidianling.consultant.bean.HotSearchBean
import com.yidianling.consultant.model.bean.ExpertBannerBean import com.yidianling.consultant.model.bean.ExpertBannerBean
import com.yidianling.consultant.model.bean.ExpertSearchBean import com.yidianling.consultant.model.bean.ExpertSearchBean
...@@ -46,11 +47,6 @@ interface SearchApi { ...@@ -46,11 +47,6 @@ interface SearchApi {
@GET @GET
fun searchDoctorService(@Url url : String): Observable<BaseAPIResponse<ExpertSearchBean>> fun searchDoctorService(@Url url : String): Observable<BaseAPIResponse<ExpertSearchBean>>
@Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@GET("delivery/banner")
fun expertBannerList(@Query(value = "planId") planId:String?="32"): Observable<BaseAPIResponse<MutableList<ExpertBannerBean>>>
//搜索页面接口 //搜索页面接口
@retrofit2.http.Headers(YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json") @retrofit2.http.Headers(YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@GET("home/search-page") @GET("home/search-page")
...@@ -70,4 +66,9 @@ interface SearchApi { ...@@ -70,4 +66,9 @@ interface SearchApi {
@Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json") @Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@GET("consult/assistant/chat-distribute") @GET("consult/assistant/chat-distribute")
fun getConsultAssistantUidRequest(): Observable<BaseAPIResponse<Long>> fun getConsultAssistantUidRequest(): Observable<BaseAPIResponse<Long>>
//获取咨询助理uid
@Headers( YDL_DOMAIN+ YDL_DOMAIN_JAVA,"Content-Type:application/json")
@POST("doctor/querySpecialTopic")
fun getBigShotData(): Observable<BaseAPIResponse<ExpertSearchTopShowBean>>
} }
\ No newline at end of file
package com.yidianling.consultant.ui.view.topView
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.yidianling.consultant.R
import com.yidianling.consultant.bean.ExpertSearchBigShotBean
import kotlinx.android.synthetic.main.consultant_expert_search_big_shot_one.view.*
class BigShotOneView : LinearLayout {
constructor(context: Context) : super(context) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context,
attrs,
defStyle
) {
mContext = context
initView()
}
private var mContext: Context? = null
private fun initView() {
layoutParams = LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
orientation = HORIZONTAL
View.inflate(mContext, R.layout.consultant_expert_search_big_shot_one, this)
}
fun setUrl(bean: ExpertSearchBigShotBean) {
GlideApp.with(mContext).load(bean.topicImages[0]).into(consultant_one_img_1)
consultant_one_img_1.setOnClickListener {
val h5Params = H5Params(bean.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
}
}
\ No newline at end of file
package com.yidianling.consultant.ui.view.topView
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.yidianling.consultant.R
import com.yidianling.consultant.bean.ExpertSearchBigShotBean
import kotlinx.android.synthetic.main.consultant_expert_search_big_shot_three.view.*
class BigShotThreeView : LinearLayout {
constructor(context: Context) : super(context) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context,
attrs,
defStyle
) {
mContext = context
initView()
}
private var mContext: Context? = null
private fun initView() {
layoutParams = LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
orientation = HORIZONTAL
View.inflate(mContext, R.layout.consultant_expert_search_big_shot_three, this)
}
fun setUrl(
bean1: ExpertSearchBigShotBean,
bean2: ExpertSearchBigShotBean,
bean3: ExpertSearchBigShotBean
) {
GlideApp.with(mContext).load(bean1.topicImages[2].imageUrl).into(consultant_three_img_1)
consultant_three_img_1.setOnClickListener {
val h5Params = H5Params(bean1.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
GlideApp.with(mContext).load(bean2.topicImages[2].imageUrl).into(consultant_three_img_2)
consultant_three_img_2.setOnClickListener {
val h5Params = H5Params(bean2.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
GlideApp.with(mContext).load(bean3.topicImages[2].imageUrl).into(consultant_three_img_3)
consultant_three_img_3.setOnClickListener {
val h5Params = H5Params(bean3.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
}
}
\ No newline at end of file
package com.yidianling.consultant.ui.view.topView
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.yidianling.consultant.R
import com.yidianling.consultant.bean.ExpertSearchBigShotBean
import kotlinx.android.synthetic.main.consultant_expert_search_big_shot_two.view.*
class BigShotTwoView : LinearLayout {
constructor(context: Context) : super(context) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context,
attrs,
defStyle
) {
mContext = context
initView()
}
private var mContext: Context? = null
private fun initView() {
layoutParams = LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
orientation = HORIZONTAL
View.inflate(mContext, R.layout.consultant_expert_search_big_shot_two, this)
}
fun setUrl(bean1: ExpertSearchBigShotBean, bean2: ExpertSearchBigShotBean) {
GlideApp.with(mContext).load(bean1.topicImages[1].imageUrl).into(consultant_two_img_1)
consultant_two_img_1.setOnClickListener {
val h5Params = H5Params(bean1.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
GlideApp.with(mContext).load(bean2.topicImages[1].imageUrl).into(consultant_two_img_2)
consultant_two_img_2.setOnClickListener {
val h5Params = H5Params(bean2.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
}
}
\ No newline at end of file
package com.yidianling.consultant.ui.view.topView
import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.LinearLayout
import com.alibaba.android.arouter.launcher.ARouter
import com.ydl.webview.H5Params
import com.ydl.webview.NewH5Activity
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydlcommon.base.config.HttpConfig
import com.yidianling.common.tools.RxDeviceTool
import com.yidianling.common.tools.RxImageTool
import com.yidianling.consultant.R
import com.yidianling.consultant.bean.ExpertSearchRecommandBean
import kotlinx.android.synthetic.main.consultant_expert_search_top_item_view.view.*
import java.net.URLDecoder
class RecommendItemView : LinearLayout {
constructor(context: Context) : super(context) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
mContext = context
initView()
}
constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
context,
attrs,
defStyle
) {
mContext = context
initView()
}
private var mContext: Context? = null
private fun initView() {
val mWidth: Int = RxDeviceTool.getScreenWidth(mContext) / 2
val mHeight: Int = RxImageTool.dp2px(60f)
val params = LayoutParams(
mWidth,
mHeight
)
params.height = mHeight
layoutParams = params
orientation = HORIZONTAL
setPadding(RxImageTool.dp2px(15f), RxImageTool.dp2px(9f), 0, RxImageTool.dp2px(11f))
View.inflate(mContext, R.layout.consultant_expert_search_top_item_view, this)
}
fun setData(bean: ExpertSearchRecommandBean) {
if (bean.topicImages.isNotEmpty() && bean.topicImages.size > 0 && bean.topicImages[0].imageUrl.isNotEmpty()) {
GlideApp.with(mContext).load(bean.topicImages[0].imageUrl).into(top_item_img)
}
top_item_title.text = bean.specialTopicTitle?:""
top_item_desc.text = bean.specialTopicSubhead?:""
setOnClickListener {
val h5Params = H5Params(bean.specialTopicUrl, null)
NewH5Activity.start(context, h5Params)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:topLeftRadius="22dp"
android:bottomLeftRadius="22dp"/>
<gradient
android:angle="0"
android:startColor="#DDFF7A5C"
android:endColor="#DDFF406C"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="5dp"
android:width="15dp" />
<corners android:radius="2.5dp" />
<solid android:color="#000000"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<size android:height="5dp"
android:width="5dp" />
<corners android:radius="2.5dp" />
<solid android:color="#dddddd"/>
</shape>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/white" android:background="@color/white"
android:orientation="vertical"> android:orientation="vertical">
<include <include
layout="@layout/consultant_layout_search_toolbar" layout="@layout/consultant_layout_search_toolbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="48dp" /> android:layout_height="48dp" />
<android.support.design.widget.CoordinatorLayout <android.support.design.widget.CoordinatorLayout
android:id="@+id/container" android:id="@+id/container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/consultant_colorBg" android:background="@color/consultant_colorBg"
tools:ignore="InefficientWeight"> tools:ignore="InefficientWeight">
<android.support.design.widget.AppBarLayout <android.support.design.widget.AppBarLayout
android:id="@+id/appbar_layout" android:id="@+id/appbar_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/consultant_colorBg" android:background="@color/consultant_colorBg"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:elevation="0dp"> app:elevation="0dp">
<android.support.design.widget.CollapsingToolbarLayout <android.support.design.widget.CollapsingToolbarLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false" android:clipToPadding="false"
app:layout_scrollFlags="scroll|exitUntilCollapsed"> app:layout_scrollFlags="scroll|exitUntilCollapsed">
<include layout="@layout/consultant_layout_search_head_bg" /> <com.yidianling.consultant.ui.view.topView.RecommendListView
android:id="@+id/recommendListView"
android:layout_width="match_parent"
</android.support.design.widget.CollapsingToolbarLayout> android:layout_height="wrap_content">
</android.support.design.widget.AppBarLayout> </com.yidianling.consultant.ui.view.topView.RecommendListView>
<include layout="@layout/consultant_layout_search_content" /> </android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!--<include layout="@layout/layout_search_head_input"/>-->
<include layout="@layout/consultant_layout_search_content" />
<!--筛选弹窗半透明背景-->
<View <!--<include layout="@layout/layout_search_head_input"/>-->
android:id="@+id/viewDim_filter"
android:layout_width="match_parent" <!--筛选弹窗半透明背景-->
android:layout_height="match_parent" <View
android:background="#40000000" android:id="@+id/viewDim_filter"
android:visibility="gone" /> android:layout_width="match_parent"
android:layout_height="match_parent"
</android.support.design.widget.CoordinatorLayout> android:background="#40000000"
</LinearLayout> android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_width="wrap_content"
android:paddingBottom="60dp" android:layout_height="wrap_content"
android:paddingRight="11dp"> android:paddingRight="11dp">
<LinearLayout
android:id="@+id/consultant_assistant_dialog_desc_outside_ll"
android:layout_width="wrap_content"
android:layout_height="84dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="25dp"
android:clipChildren="true"
android:gravity="center"
android:orientation="horizontal"
android:paddingRight="25dp"
android:paddingBottom="40dp">
<LinearLayout
android:id="@+id/consultant_assistant_dialog_desc_ll"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/consultant_assistant_dialog_text_bg"
android:gravity="center">
<ImageView
android:id="@+id/consultant_assistant_dialog_close"
android:layout_width="35dp"
android:layout_height="30dp"
android:paddingLeft="15dp"
android:paddingTop="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:src="@drawable/consultant_assistant_dialog_close_icon" />
<View
android:layout_width="0.5dp"
android:layout_height="26dp"
android:layout_marginRight="8dp"
android:background="#ffffff" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="15dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="不知道如何选择?"
android:textColor="#ffffff"
android:textSize="12dp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="为你精准匹配咨询师 "
android:textColor="#ffffff"
android:textSize="12dp" />
<ImageView
android:layout_width="10dp"
android:layout_height="10dp"
android:src="@drawable/consultant_assistant_dialog_go_icon" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</LinearLayout>
<ImageView <ImageView
android:id="@+id/consult_assistant" android:id="@+id/consultant_assistant"
android:layout_width="66dp" android:layout_width="61dp"
android:layout_height="68dp" android:layout_height="101dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/consultant_expert_consult_assistant_img"/> android:src="@drawable/consultant_assistant_dialog_img"
android:paddingBottom="40dp" />
</RelativeLayout> </RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="84dp"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp">
<ImageView
android:id="@+id/consultant_one_img_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="84dp"
android:orientation="horizontal"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp"
android:layout_marginRight="5dp">
<ImageView
android:id="@+id/consultant_three_img_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
<ImageView
android:id="@+id/consultant_three_img_2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp"
android:layout_marginLeft="5dp">
<ImageView
android:id="@+id/consultant_three_img_3"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="84dp"
android:orientation="horizontal"
xmlns:app="http://schemas.android.com/apk/res-auto">
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp"
android:layout_marginRight="5dp">
<ImageView
android:id="@+id/consultant_two_img_1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="match_parent"
app:cardElevation="0dp"
app:cardCornerRadius="6dp"
android:layout_marginLeft="5dp">
<ImageView
android:id="@+id/consultant_two_img_2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:background="#eeeeee"/>
</android.support.v7.widget.CardView>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:parentTag="android.widget.LinearLayout">
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipChildren="true">
<android.support.v4.view.ViewPager
android:id="@+id/recommendViewPager"
android:paddingTop="11dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FAFAFA" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="15dp"
android:orientation="horizontal"
android:background="#FAFAFA"
android:gravity="center">
<View
android:id="@+id/leftIndicator"
android:layout_width="15dp"
android:layout_height="5dp"
android:layout_marginRight="3dp"/>
<View
android:id="@+id/rightIndicator"
android:layout_width="15dp"
android:layout_height="5dp"
android:layout_marginLeft="3dp"/>
</LinearLayout>
<LinearLayout
android:id="@+id/itemListView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="15dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingBottom="15dp"
android:orientation="vertical"
android:background="#FFFFFF">
</LinearLayout>
</LinearLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:parentTag="LinearLayout">
<android.support.v7.widget.CardView
android:layout_width="40dp"
android:layout_height="40dp"
android:background="#eeeeee"
android:layout_marginRight="10dp"
>
<ImageView
android:id="@+id/top_item_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
</android.support.v7.widget.CardView>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/top_item_title"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:gravity="left|top"
android:text="标题"
android:textSize="14dp"
android:textColor="#242424"
android:textStyle="bold"/>
<TextView
android:id="@+id/top_item_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="left|top"
android:text="我是描述"
android:textSize="11dp"
android:textColor="#999999"/>
</LinearLayout>
</merge>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<com.yidianling.consultant.ui.view.DisInterceptNestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/search_head_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/platform_white"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_collapseMode="parallax"
app:layout_collapseParallaxMultiplier="0.8">
<android.support.v7.widget.CardView
android:id="@+id/user_head_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="15dp"
android:layout_marginTop="10dp"
android:layout_marginRight="15dp"
android:layout_marginBottom="10dp"
android:elevation="0dp"
android:orientation="vertical"
app:cardCornerRadius="4dp">
<com.ydl.ydlcommon.view.banner.Banner
android:id="@+id/banner_search"
android:layout_width="match_parent"
android:layout_height="99dp"
android:scaleType="centerCrop"
app:pa_indicator_different_width="14dp"
app:pa_indicator_drawable_selected="@drawable/consultant_banner_indicator_select"
app:pa_indicator_drawable_unselected="@drawable/consultant_banner_indicator_unselect"
app:pa_indicator_height="5dp"
app:pa_indicator_margin="1.25dp"
app:pa_is_selected_same_unselected="false"
app:pa_is_show_indicator="false" />
</android.support.v7.widget.CardView>
</com.yidianling.consultant.ui.view.DisInterceptNestedScrollView>
...@@ -55,7 +55,7 @@ class YDLCommonPlugin : MethodChannel.MethodCallHandler { ...@@ -55,7 +55,7 @@ class YDLCommonPlugin : MethodChannel.MethodCallHandler {
val loginBean = ModularServiceManager.getPlatformUserService()?.getUser() val loginBean = ModularServiceManager.getPlatformUserService()?.getUser()
val mMap = mutableMapOf<String, Any>() val mMap = mutableMapOf<String, Any>()
var uid = loginBean?.userId ?: "" var uid = loginBean?.userId ?: ""
mMap["isDevelopment"] =BuildConfig.DEBUG mMap["isDevelopment"] = false
mMap["uid"] = if (TextUtils.isEmpty(uid)) "0" else uid mMap["uid"] = if (TextUtils.isEmpty(uid)) "0" else uid
mMap["accessToken"] = loginBean?.token ?: "" mMap["accessToken"] = loginBean?.token ?: ""
?: "" ?: ""
......
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