Commit e7807ffb authored by zhenghongbin's avatar zhenghongbin

add 删除无用代码

parent 03cb3b39
......@@ -57,12 +57,9 @@ dependencies {
implementation rootProject.ext.dependencies.publicImplementation
testImplementation rootProject.ext.dependencies.testImplementation
androidTestImplementation rootProject.ext.dependencies.androidTestImplementation
kapt 'com.yidian.chameleon:annotationcompiler:0.3.29'
implementation 'com.yidian.chameleon:annotation:0.3.29'
api deps.yac.core
api deps.xarc.xbrid
api "com.yidian.xarc:xevent:0.0.3"
// api project(':flutter')
api "com.yidian.xpage:xpagenative:0.0.1"
implementation files('libs/openDefault-10.10.0.aar')
}
\ No newline at end of file
......@@ -3,9 +3,5 @@
package="com.yidian.common">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application>
<activity android:name=".activity.OneKeyLoginActivity"/>
<activity android:name=".activity.LoginActivity" />
</application>
</manifest>
package com.yidian.common
class WebConfig {
companion object{
const val ADD_COMMENT: String = "addComment"
const val GET_GIF_DATA: String = "getGifData"
const val GO_TO_COMMENT_DETAIL: String = "gotoCommentDetail"
const val REPLY_DETAIL_COMMENT: String = "replyDetailComment"
const val UPDATE_LIKE: String = "updateLike"
const val GET_DOCID: String = "getDocId"
const val WEB_URL: String = "http://10.60.100.23:3100/"
}
}
\ No newline at end of file
package com.yidian.common
class Constants {
companion object{
const val ITEM_TYPE_CHAMELEON = -1
const val CHAMELEON_ID = "chameleon_id"
const val CHAMELEON_D_TYPE = "dtype"
}
}
\ No newline at end of file
......@@ -7,28 +7,14 @@ class XRouterPathConstants {
companion object {
const val ParamsKey = "ParamsMap"
const val FLASH = "/flash"
const val LOGIN = "/loginPhone"
const val LOGIN_LIFE_CIRCLE = "/loginLifeCircle"
const val ONE_KEY_LOGIN = "/common/oneKeyLogin"
const val LOGIN_NATIVE = "/loginNative"
const val USER_INFO = "/fragment/userInfo"
const val NEWS_MAIN = "/MainActivity"
const val HOME = "/Home"
const val NEWS_CONTENT = "/news"
const val GALLERY = "/imageGallery"
const val PROTOCOL = "/protocol"
const val SUPPORT = "/productSupport"
const val AUTHOR_HOME_PAGE = "/authorhome"
const val BROWSING_HISTORY = "/mine/BrowsingHistoryActivity"
const val COLLECTION = "/favorites"
const val SUBSCRIPTION = "/subscribe"
const val SEARCH_CHANNEL = "/newscontent/SearchChannelActivity"
const val SEARCH_RESULT = "/newscontent/SearchResultPageActivity"
const val AUDIO_DETAIL = "/newscontent/AudioDetailActivity"
const val VIDEO_COMMENT_DETAIL = "/newscontent/VideoDetailActivity"
const val COMMENT_TEST = "/newscontent/CommentTestActivity"
const val MINE = "/mine"
const val FLASH = "/flash"
const val LOGIN_LIFE_CIRCLE = "/loginLifeCircle"
const val LIFE_ACCOUNT_IDENTITY = "/lifeAccountIdentity"
const val LIFE_ACCOUNT_AUTH = "/lifeAccountAuth"
const val ID_CARD_TEST = "/idCardTest"
......
package com.yidian.common.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import com.orhanobut.hawk.Hawk
import com.umeng.socialize.UMAuthListener
import com.umeng.socialize.UMShareAPI
import com.umeng.socialize.UMShareConfig
import com.umeng.socialize.bean.SHARE_MEDIA
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.common.databinding.ActivityLoginBinding
import com.yidian.common.http.HttpResult
import com.yidian.common.http.httpbean.IApiCallback
import com.yidian.common.http.httpbean.LoginBean
import com.yidian.xpage.XPageViewProtocol
import kotlinx.android.synthetic.main.activity_login.*
class LoginActivity : BaseActivity<ActivityLoginBinding>(), XPageViewProtocol, IApiCallback {
override fun createViewBinding(): ActivityLoginBinding {
return ActivityLoginBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return XRouterPathConstants.LOGIN_NATIVE
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
setClickListener()
}
private fun setClickListener(){
lly_wechat.setOnClickListener{
loginByUmeng(SHARE_MEDIA.WEIXIN)
}
lly_qq.setOnClickListener{
loginByUmeng(SHARE_MEDIA.QQ)
}
lly_sina.setOnClickListener{
loginByUmeng(SHARE_MEDIA.SINA)
}
}
private fun loginByUmeng(platform: SHARE_MEDIA){
val config = UMShareConfig()
config.isNeedAuthOnGetUserInfo(true)
val mShareAPI = UMShareAPI.get(this@LoginActivity)
mShareAPI.setShareConfig(config)
mShareAPI.getPlatformInfo(this@LoginActivity, platform, object : UMAuthListener {
override fun onStart(platform: SHARE_MEDIA?) {
}
override fun onComplete(platform: SHARE_MEDIA?, action: Int, data: MutableMap<String, String>) {
val uid = data["uid"]
val name = data["name"]
val gender = data["gender"]
val iconurl = data["iconurl"]
Log.e("zhb-yd", "登录成功:uid->$uid,name->$name,gender->$gender,iconurl->$iconurl")
Hawk.put(HawkConfig.LoginStatus, true)
setResult(1, intent.putExtra("token", uid))
finish()
}
override fun onError(platform: SHARE_MEDIA?, action: Int, t: Throwable) {
Log.e("zhb-yd", "登录失败:" + t.message)
}
override fun onCancel(platform: SHARE_MEDIA?, action: Int) {
Log.e("zhb-yd", "登录取消")
}
})
}
override fun loginCallBack(t: HttpResult<LoginBean.Response?>?) {
Hawk.put(HawkConfig.LoginStatus, true)
val token = t?.result?.token
setResult(1, intent.putExtra("token", token))
finish()
}
override val context: Context
get() = this@LoginActivity
override fun showLoading(message: String?) {
TODO("Not yet implemented")
}
override fun showLoading() {
TODO("Not yet implemented")
}
override fun dismissLoading() {
TODO("Not yet implemented")
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data)
}
}
\ No newline at end of file
package com.yidian.common.activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import cn.jiguang.verifysdk.api.JVerificationInterface
import com.orhanobut.hawk.Hawk
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.base.BaseActivity
import com.yidian.common.databinding.ActivityOneKeyLoginBinding
import com.yidian.common.http.HttpResult
import com.yidian.common.http.httpbean.IApiCallback
import com.yidian.common.http.httpbean.LoginBean
import com.yidian.utils.ToastUtil
import com.yidian.xpage.XPageViewProtocol
import kotlinx.android.synthetic.main.activity_one_key_login.*
class OneKeyLoginActivity: BaseActivity<ActivityOneKeyLoginBinding>(), XPageViewProtocol, IApiCallback {
private lateinit var token: String
private lateinit var operator: String
override fun createViewBinding(): ActivityOneKeyLoginBinding {
return ActivityOneKeyLoginBinding.inflate(layoutInflater)
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
initJVerification()
setClickListener()
}
override fun getXPageName(): String {
return XRouterPathConstants.ONE_KEY_LOGIN
}
private fun initJVerification(){
JVerificationInterface.getToken(this, 5000) { code, content, operator ->
if(code == 2000){
this.token = content
this.operator = operator
Log.e("zhb-yd", "token=$content, operator=$operator")
}else{
Log.e("zhb-yd", "code=$code, message=$content")
}
}
}
private fun setClickListener(){
btn_oneKeyLogin.setOnClickListener{
ToastUtil.showToast(this, "极光一键登录")
Hawk.put(HawkConfig.LoginStatus, true)
setResult(1, intent.putExtra("token", token))
finish()
}
tv_login.setOnClickListener{
startActivityForResult(Intent(this, LoginActivity::class.java),0)
}
}
override fun loginCallBack(t: HttpResult<LoginBean.Response?>?) {
TODO("Not yet implemented")
}
override val context: Context
get() = this@OneKeyLoginActivity
override fun showLoading(message: String?) {
TODO("Not yet implemented")
}
override fun showLoading() {
TODO("Not yet implemented")
}
override fun dismissLoading() {
TODO("Not yet implemented")
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(resultCode == 1){
setResult(resultCode, data)
finish()
}
}
}
\ No newline at end of file
package com.yidian.common.base
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import java.lang.ref.WeakReference
abstract class BaseActivityRepository<V : IBaseView>(view:V):IRepository {
private var viewReference:WeakReference<out IBaseView> = WeakReference(view)
init {
view.lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
viewReference.get()?.lifecycle?.removeObserver(this)
}
}
\ No newline at end of file
package com.yidian.common.base
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.OnLifecycleEvent
import java.lang.ref.WeakReference
abstract class BaseFragmentRepository<V : IBaseView>(view:V):IRepository{
protected val viewReference:WeakReference<V> = WeakReference(view)
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){}
}
\ No newline at end of file
package com.yidian.common.base
import android.os.Bundle
import androidx.viewbinding.ViewBinding
abstract class BaseRepositoryFragment<R : BaseActivityRepository<out IBaseView>,VB :ViewBinding> :BaseFragment<VB>() {
protected val repository :R = createRepository()
abstract fun createRepository(): R
/**
* 此处为了处理Fragment复用后ARepository的生命周期丢失问题
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
lifecycle.addObserver(repository)
}
override fun onDestroy() {
super.onDestroy()
lifecycle.removeObserver(repository)
}
}
\ No newline at end of file
package com.yidian.common.base
import androidx.lifecycle.LifecycleOwner
interface IBaseView :LifecycleOwner{
}
\ No newline at end of file
package com.yidian.common.base
import androidx.lifecycle.LifecycleObserver
interface IRepository: LifecycleObserver
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.yidian.chameleon.ChameleonParser
import org.json.JSONObject
class CardFactory {
companion object{
fun createChameleonCard(parent: ViewGroup, cardType: Int, chameleonViewUtils: ChameleonViewUtils, bean: JSONObject): View{
val chameleonParser = ChameleonParser(parent.context)
val chameleonView: View = chameleonViewUtils.createChameleonView(cardType, chameleonParser)
chameleonParser.bindTemplateData(chameleonView, bean)
return chameleonView
}
fun createViewHolder(parent: ViewGroup, cardType: Int, chameleonViewUtils: ChameleonViewUtils): RecyclerView.ViewHolder {
return ChameleonCard(parent, cardType, chameleonViewUtils).getYdViewHolder()
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.View
import android.view.ViewGroup
import com.yidian.chameleon.ChameleonParser
import com.yidian.common.cardutils.bean.CommonCardBean
import org.json.JSONObject
class ChameleonCard(parent: ViewGroup, cardType: Int, chameleonViewUtils: ChameleonViewUtils): CommonCard() {
private val chameleonParser = ChameleonParser(parent.context)
private val chameleonView: View = chameleonViewUtils.createChameleonView(cardType, chameleonParser)
init {
setCardView(chameleonView)
setClickListener()
}
override fun setData(bean: Any) {
bean as CommonCardBean
chameleonParser.bindTemplateData(chameleonView, JSONObject(bean.content as Map<*, *>))
}
private fun setClickListener() {
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.TextView
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.RecyclerView
import com.yidian.chameleon.ChameleonParser
import com.yidian.common.R
import com.yidian.common.YdBaseApplication.Companion.context
class ChameleonViewUtils(context: Context) {
var chameleonParser: ChameleonParser = ChameleonParser(context)
fun createChameleonView(chameleonId: Int, chameleonParser: ChameleonParser = this.chameleonParser): View {
if (chameleonId == 800001) {
val params = RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT,200)
return TextView(context).apply {
text = "测试数据 80001"
textSize = 17f
gravity = Gravity.CENTER
layoutParams = params
}
} else {
return chameleonParser.createView(chameleonId.toString())
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.View
abstract class CommonCard: IHolderData {
private lateinit var viewHolder: YdViewHolder
private lateinit var cardView: View
fun setCardView(cardView: View){
this.cardView = cardView
viewHolder = YdViewHolder(cardView, this)
}
fun getCardView(): View{
return cardView
}
fun getYdViewHolder(): YdViewHolder{
return viewHolder
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.yidian.common.R
import com.yidian.common.XRouterPathConstants
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.services.XEventService
import com.yidian.nightmode.widget.YdCheckedBox
import com.yidian.nightmode.widget.YdImageView
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xpage.XPageManager
class CommonDailyCard(val parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_common_daily_card, parent, false)
private val cbChecked = rootView.findViewById<YdCheckedBox>(R.id.cb_checked)
private val ivClose = rootView.findViewById<YdImageView>(R.id.iv_close)
private lateinit var polymerCommonCardBean: PolymerCommonCardBean
init {
setCardView(rootView)
setClickListener()
}
override fun setData(bean: Any) {
bean as PolymerCommonCardBean
polymerCommonCardBean = bean
if(polymerCommonCardBean.isShowChecked){
cbChecked.visibility = View.VISIBLE
cbChecked.isChecked = polymerCommonCardBean.isChecked
}else{
cbChecked.visibility = View.GONE
}
}
private fun setClickListener(){
rootView.setOnClickListener{
XPageManager.push(XRouterPathConstants.AUTHOR_HOME_PAGE, null)
}
ivClose.setOnClickListener {
val xBaseEvent = XBaseEvent("feedback", "CommonDailyCard")
XEventService.postEvent(xBaseEvent)
}
cbChecked.setOnClickListener {
polymerCommonCardBean.isChecked = cbChecked.isChecked
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.yidian.common.R
import com.yidian.nightmode.widget.YdLinearLayout
import com.yidian.nightmode.widget.YdRelativeLayout
class DailyHeadCard(parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_daily_head_card, parent, false)
private val rlyNewsBroadcast = rootView.findViewById<YdRelativeLayout>(R.id.rly_newsBroadcast)
private val llySubscribe = rootView.findViewById<YdLinearLayout>(R.id.lly_subscribe)
init {
setCardView(rootView)
setClickListener()
}
override fun setData(bean: Any) {
}
private fun setClickListener(){
rlyNewsBroadcast.setOnClickListener {
}
llySubscribe.setOnClickListener {
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.common.R
import com.yidian.common.cardutils.adapter.FlashAdapter
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.nightmode.widget.YdRecyclerView
class FlashHeadCard(var parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_flash_head_card, parent, false)
private val rvHead = rootView.findViewById<YdRecyclerView>(R.id.rv_head)
val adapter: FlashAdapter by lazy { FlashAdapter(parent.context) }
init {
initView()
setCardView(rootView)
}
private fun initView(){
val layoutManager = LinearLayoutManager(parent.context)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
rvHead.layoutManager = layoutManager
rvHead.adapter = adapter
}
override fun setData(bean: Any) {
bean as PolymerCommonCardBean
// adapter.update(bean.flashHeadBeanList)
}
}
\ No newline at end of file
package com.yidian.common.cardutils
interface IHolderData {
fun setData(bean: Any)
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.yidian.common.R
class LoadNoMoreCard(val parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_load_no_more, parent, false)
init {
setCardView(rootView)
}
override fun setData(bean: Any) {
}
}
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.yidian.common.R
import com.yidian.common.XRouterPathConstants
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.nightmode.widget.YdCheckedBox
import com.yidian.xpage.XPageManager
class PodcastDailyCard(parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_podcast_daily_card, parent, false)
private val cbChecked = rootView.findViewById<YdCheckedBox>(R.id.cb_checked)
private val tvHomeName = rootView.findViewById<TextView>(R.id.tv_itemHomeName)
private val tvHomeContent = rootView.findViewById<TextView>(R.id.tv_itemHomeContent)
private lateinit var polymerCommonCardBean: PolymerCommonCardBean
init {
setCardView(rootView)
setClickListener()
}
override fun setData(bean: Any) {
bean as PolymerCommonCardBean
polymerCommonCardBean = bean
if(polymerCommonCardBean.isShowChecked){
cbChecked.visibility = View.VISIBLE
cbChecked.isChecked = polymerCommonCardBean.isChecked
}else{
cbChecked.visibility = View.GONE
}
// tvHomeName.text = polymerCommonCardBean.name
// tvHomeContent.text = polymerCommonCardBean.content
}
private fun setClickListener(){
rootView.setOnClickListener{
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, null)
}
cbChecked.setOnClickListener {
polymerCommonCardBean.isChecked = cbChecked.isChecked
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
class PolymerCardFactory {
companion object{
const val LoadNoMoreCard = -200 //加载更多无数据卡
const val SubscribeHead = 902 //订阅头部卡
const val SubscribeHeadNull = 903 //无订阅头部卡
const val CommonPolymerCard = 100 //普通聚合卡
fun createViewHolder(parent: ViewGroup, cardType: Int, chameleonViewUtils: ChameleonViewUtils): RecyclerView.ViewHolder {
return when(cardType){
LoadNoMoreCard -> LoadNoMoreCard(parent).getYdViewHolder()
SubscribeHead -> SubscribeHeadCard(parent).getYdViewHolder()
SubscribeHeadNull -> SubscribeHeadTextCard(parent, chameleonViewUtils).getYdViewHolder()
else -> PolymerNormalCard(parent, chameleonViewUtils).getYdViewHolder()
}
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.common.R
import com.yidian.common.cardutils.adapter.CommonAdapter
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.widget.YdMaxRecyclerView
import com.yidian.nightmode.widget.YdCheckedBox
import com.yidian.nightmode.widget.YdFrameLayout
import com.yidian.nightmode.widget.YdView
import org.json.JSONObject
class PolymerNormalCard(var parent: ViewGroup, var chameleonViewUtils: ChameleonViewUtils): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_polymer_chameleon_card, parent, false)
private val headerParent = rootView.findViewById<YdFrameLayout>(R.id.fly_header)
private val rvCard = rootView.findViewById<YdMaxRecyclerView>(R.id.rv_card)
private val cbChecked = rootView.findViewById<YdCheckedBox>(R.id.cb_checked)
private val vManage = rootView.findViewById<YdView>(R.id.v_manage)
private val cardAdapter = CommonAdapter(chameleonViewUtils)
private lateinit var polymerCommonCardBean: PolymerCommonCardBean
init {
setCardView(rootView)
initRecyclerView()
setClickListener()
}
private fun initRecyclerView(){
rvCard.layoutManager = LinearLayoutManager(parent.context)
rvCard.adapter = cardAdapter
rvCard.isNestedScrollingEnabled = false
}
override fun setData(bean: Any) {
polymerCommonCardBean = bean as PolymerCommonCardBean
if(polymerCommonCardBean.isShowChecked){
cbChecked.visibility = View.VISIBLE
vManage.visibility = View.VISIBLE
}else{
cbChecked.visibility = View.GONE
vManage.visibility = View.GONE
}
cbChecked.isChecked = polymerCommonCardBean.isChecked
val header = bean.header
if(header != null){
val headerView = CardFactory.createChameleonCard(headerParent, header.card_type_id, chameleonViewUtils, JSONObject(header.content as Map<*, *>))
headerParent.removeAllViews()
headerParent.addView(headerView)
}else{
headerParent.removeAllViews()
}
val cardList = bean.card_list
if(cardList != null){
cardAdapter.update(cardList)
}
}
private fun setClickListener() {
vManage.setOnClickListener {
cbChecked.isChecked = !cbChecked.isChecked
polymerCommonCardBean.isChecked = cbChecked.isChecked
}
}
}
\ No newline at end of file
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.yidian.common.R
import com.yidian.common.XRouterPathConstants
import com.yidian.common.YdBaseApplication
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.common.cardutils.adapter.SubscribeAdapter
import com.yidian.common.cardutils.bean.CommonCardBean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.cardutils.bean.SubscribeHeadBean
import com.yidian.nightmode.widget.YdRecyclerView
import com.yidian.utils.ToastUtil
import com.yidian.xpage.XPageManager
import org.json.JSONArray
class SubscribeHeadCard(val parent: ViewGroup): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_subscribe_head_card, parent, false)
private val rvSubscribe = rootView.findViewById<YdRecyclerView>(R.id.rv_subscribe)
val adapter: SubscribeAdapter by lazy { SubscribeAdapter(parent.context) }
private val subscribeHeadBeanList: ArrayList<SubscribeHeadBean> by lazy { ArrayList<SubscribeHeadBean>() }
private var lastClickTime = 0L
init {
initView()
setCardView(rootView)
setClickListener()
}
private fun initView(){
val layoutManager = LinearLayoutManager(parent.context)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
rvSubscribe.layoutManager = layoutManager
rvSubscribe.adapter = adapter
}
override fun setData(bean: Any) {
bean as PolymerCommonCardBean
val commonCardBean = bean.card_list?.get(0)
subscribeHeadBeanList.clear()
subscribeHeadBeanList.add(SubscribeHeadBean("nativeAdd", "添加", null).setViewType(SubscribeAdapter.headType))
val gson = Gson()
val beanJson = gson.toJson(commonCardBean?.content)
val headerResultList = gson.fromJson<ArrayList<SubscribeHeadBean>>(beanJson, object: TypeToken<ArrayList<SubscribeHeadBean>>(){}.type)
subscribeHeadBeanList.addAll(headerResultList)
subscribeHeadBeanList.add(SubscribeHeadBean("nativeAll", "全部", null).setViewType(SubscribeAdapter.footerType))
adapter.update(subscribeHeadBeanList)
}
private fun setClickListener(){
adapter.setOnItemClickListener(object : OnItemClickListener<SubscribeHeadBean> {
override fun onClick(view: View?, position: Int, item: SubscribeHeadBean?) {
val currentClickTime = System.currentTimeMillis()
if(currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
item?.let {
when (item.wm_id) {
"nativeAdd" -> ToastUtil.showToast(YdBaseApplication.context, "该功能暂未开放")
"nativeAll" -> {
XPageManager.push(XRouterPathConstants.SUBSCRIPTION, null)
}
else -> {
val paramsMap = hashMapOf<String, Any>(Pair("fromId", item.wm_id!!))
XPageManager.push(XRouterPathConstants.AUTHOR_HOME_PAGE, paramsMap)
}
}
}
}
})
}
}
package com.yidian.common.cardutils
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.yidian.common.R
import com.yidian.common.cardutils.adapter.OnItemClickListener
import com.yidian.common.cardutils.adapter.SubscribeAdapter
import com.yidian.common.cardutils.bean.CommonCardBean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.cardutils.bean.SubscribeHeadBean
import com.yidian.nightmode.widget.YdFrameLayout
import com.yidian.nightmode.widget.YdRecyclerView
import com.yidian.utils.ToastUtil
import org.json.JSONArray
import org.json.JSONObject
class SubscribeHeadTextCard(val parent: ViewGroup, var chameleonViewUtils: ChameleonViewUtils): CommonCard() {
private val rootView: View = LayoutInflater.from(parent.context).inflate(R.layout.item_subscribe_head_text_card, parent, false)
private val flyRoot = rootView.findViewById<YdFrameLayout>(R.id.fly_root)
init {
setCardView(rootView)
}
override fun setData(bean: Any) {
bean as PolymerCommonCardBean
val commonCardBean = bean.card_list?.get(0)
val cardType = commonCardBean?.card_type_id
if(cardType != null){
val cardView = CardFactory.createChameleonCard(flyRoot, cardType, chameleonViewUtils, JSONObject(commonCardBean.content as Map<*, *>))
flyRoot.addView(cardView)
}
}
}
package com.yidian.common.cardutils
import android.view.View
import androidx.recyclerview.widget.RecyclerView
class YdViewHolder(itemView: View, var holderData: IHolderData): RecyclerView.ViewHolder(itemView){
fun setData(data: Any){
holderData.setData(data)
}
}
\ No newline at end of file
package com.yidian.common.cardutils.adapter
import android.util.Log
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.cardutils.CardFactory
import com.yidian.common.cardutils.ChameleonViewUtils
import com.yidian.common.cardutils.YdViewHolder
import com.yidian.common.cardutils.bean.CommonCardBean
class CommonAdapter(var chameleonViewUtils: ChameleonViewUtils): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<CommonCardBean> by lazy { ArrayList<CommonCardBean>() }
override fun getItemCount(): Int {
return dataList.size
}
override fun getItemViewType(position: Int): Int {
return dataList[position].card_type_id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return CardFactory.createViewHolder(parent, viewType, chameleonViewUtils)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as YdViewHolder
holder.setData(dataList[position])
}
fun update(newData: ArrayList<CommonCardBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
}
package com.yidian.common.cardutils.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.R
import com.yidian.common.YdBaseApplication.Companion.context
import com.yidian.common.cardutils.bean.FlashHeadBean
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_flash_head.*
class FlashAdapter(var context: Context): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<FlashHeadBean> by lazy { ArrayList<FlashHeadBean>() }
private lateinit var mOnItemClickListener: OnItemClickListener<FlashHeadBean>
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_flash_head))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
holder.itemView.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
fun update(newData: ArrayList<FlashHeadBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
override fun getItemCount(): Int {
return dataList.size
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<FlashHeadBean>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
@SuppressLint("ResourceAsColor")
fun setData(flashHeadBean: FlashHeadBean) {
tv_tab.text = flashHeadBean.tab
if(flashHeadBean.isChecked){
tv_tab.setTextColor(context.resources.getColor(R.color.secondTabSelectColor))
tv_tab.setBackgroundResource(R.drawable.bg_checked_radio)
}else{
tv_tab.setTextColor(context.resources.getColor(R.color.secondTabUnSelectColor))
tv_tab.setBackgroundResource(R.drawable.bg_unchecked_radio)
}
}
}
}
package com.yidian.common.cardutils.adapter
import android.view.View
import com.yidian.common.cardutils.bean.SubscribeHeadBean
interface OnItemClickListener<T> {
fun onClick(view: View?, position: Int, item: T?)
......
package com.yidian.common.cardutils.adapter
import android.content.Context
import android.util.Log
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.yidian.common.cardutils.ChameleonViewUtils
import com.yidian.common.cardutils.PolymerCardFactory
import com.yidian.common.cardutils.YdViewHolder
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
class PolymerCardAdapter(context: Context): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<PolymerCommonCardBean> by lazy { ArrayList<PolymerCommonCardBean>() }
private val chameleonViewUtils: ChameleonViewUtils = ChameleonViewUtils(context)
override fun getItemCount(): Int {
return dataList.size
}
override fun getItemViewType(position: Int): Int {
return dataList[position].aggregation_card_type_id
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return PolymerCardFactory.createViewHolder(parent, viewType, chameleonViewUtils)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as YdViewHolder
holder.setData(dataList[position])
}
fun update(newData: ArrayList<PolymerCommonCardBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
fun loadMore(newData: ArrayList<PolymerCommonCardBean>){
newData.let {
dataList.addAll(it)
notifyDataSetChanged()
}
}
fun clear(){
dataList.clear()
notifyDataSetChanged()
}
}
package com.yidian.common.cardutils.adapter
import android.annotation.SuppressLint
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.yidian.common.R
import com.yidian.common.cardutils.bean.SubscribeHeadBean
import com.yidian.common.utils.ViewHolderUtil.Companion.createItemView
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_subscribe_head.*
class SubscribeAdapter(val context: Context): RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object{
const val commonType = 0
const val headType = -1
const val footerType = -2
}
private val dataList: ArrayList<SubscribeHeadBean> by lazy { ArrayList<SubscribeHeadBean>() }
private lateinit var mOnItemClickListener: OnItemClickListener<SubscribeHeadBean>
override fun getItemViewType(position: Int): Int {
return dataList[position].getViewType()
}
override fun getItemCount(): Int {
return dataList.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(context, createItemView(parent, R.layout.item_subscribe_head), viewType)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position])
holder.itemView.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
fun update(newData: ArrayList<SubscribeHeadBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<SubscribeHeadBean>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(val context: Context, itemView: View, private val viewType: Int) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
@SuppressLint("ResourceAsColor")
fun setData(subscribeHeadBean: SubscribeHeadBean) {
tv_content.text = subscribeHeadBean.name
if(viewType == commonType){
iv_add.visibility = View.GONE
iv_more.visibility = View.GONE
iv_icon.visibility = View.VISIBLE
iv_point.visibility = View.VISIBLE
Glide.with(context).load(subscribeHeadBean.image).into(iv_icon)
}else{
iv_icon.visibility = View.GONE
iv_point.visibility = View.GONE
if(viewType == headType){
iv_add.visibility = View.VISIBLE
iv_more.visibility = View.GONE
}else if(viewType == footerType){
iv_more.visibility = View.VISIBLE
iv_add.visibility = View.GONE
}
}
}
}
}
package com.yidian.common.cardutils.bean
class CommonCardBean(
var flow_type_id: Int = 0,
var card_type_id: Int = 0,
var chameleon_id: String = "",
var content: Any
)
\ No newline at end of file
package com.yidian.common.cardutils.bean
class FlashHeadBean(var tabId: Int, var tab: String, var isChecked: Boolean)
\ No newline at end of file
package com.yidian.common.cardutils.bean
class PolymerCommonCardBean(var aggregation_card_type_id: Int, var header: CommonCardBean?, var card_list: ArrayList<CommonCardBean>?){
var isShowChecked: Boolean = false
var isChecked: Boolean = false
}
\ No newline at end of file
package com.yidian.common.cardutils.bean
import com.yidian.common.cardutils.adapter.SubscribeAdapter
class SubscribeHeadBean(var wm_id: String?, var name: String?, var image: String?){
private var viewType = SubscribeAdapter.commonType
fun setViewType(viewType: Int): SubscribeHeadBean{
this.viewType = viewType
return this
}
fun getViewType(): Int{
return this.viewType
}
}
\ No newline at end of file
package com.yidian.common.chameleon
import org.json.JSONObject
data class ChameleonEvent (
var module:String?,
var action:String?,
var params:JSONObject?,
var options:JSONObject?
)
\ No newline at end of file
package com.yidian.common.chameleon
interface ChameleonEventService {
fun dispatchEvent(event:ChameleonEvent)
}
\ No newline at end of file
package com.yidian.common.chameleon
object ChameleonServiceManager {
private val services:MutableSet<ChameleonEventService> = mutableSetOf()
fun registerChameleonService(service:ChameleonEventService){
services.add(service)
}
fun unregisterChameleonService(service:ChameleonEventService){
services.remove(service)
}
fun unregisterAllChameleonService(){
services.clear()
}
fun dispatchEvent(event:ChameleonEvent){
services.forEach{
it.dispatchEvent(event)
}
}
}
\ No newline at end of file
package com.yidian.common.chameleon
import com.yidian.chameleon.js.BridgeService
import com.yidian.chameleon.js.BridgeService.IAppDispatcher
import io.reactivex.Observable
import org.json.JSONObject
class ChameleonServiceRouter: IAppDispatcher {
override fun connectEventReceiver(eventReceiver: IAppDispatcher.IServiceEventReceiver?): String {
return ""
}
override fun dispatchCall(
module: String?,
action: String?,
params: JSONObject?,
options: JSONObject?
): Observable<BridgeService.JsResult> {
ChameleonServiceManager.dispatchEvent(ChameleonEvent(module,action,params,options))
val jsResult = BridgeService.JsResult(params)
return Observable.just(jsResult)
}
override fun disconnectEventReceiver(evToken: String?) {}
}
\ No newline at end of file
......@@ -18,25 +18,25 @@ class HttpParamsUtils{
queryParamsMap["distribution"] = AppConfig.distribution
queryParamsMap["net"] = networkType
queryParamsMap["platform"] = AppConfig.platform
queryParamsMap["equipment_id"] = getEquipmentId()
queryParamsMap["device_finger"] = getDeviceFinger()
queryParamsMap["reqid"] = getRequestId(timeStamp)
return queryParamsMap
}
private fun getEquipmentId(): String{
var equipmentId = ""
val tempId = FtDeviceFingerManager.getEquipmentId()
private fun getDeviceFinger(): String{
var deviceFinger = ""
val tempId = FtDeviceFingerManager.getDeviceFinger()
if(tempId != null){
equipmentId = tempId
deviceFinger = tempId
}
return equipmentId
return deviceFinger
}
private fun getRequestId(timeStamp: Long): String{
val sb = StringBuilder()
sb.append(AppConfig.appid)
sb.append('_')
sb.append(getEquipmentId())
sb.append(getDeviceFinger())
sb.append('_')
sb.append(timeStamp)
return sb.toString()
......@@ -46,7 +46,7 @@ class HttpParamsUtils{
val sb = StringBuilder()
sb.append(AppConfig.appid)
sb.append(AppConfig.platform)
sb.append(getEquipmentId())
sb.append(getDeviceFinger())
sb.append(getRequestId(timeStamp))
sb.append("ydapp-metro")
val signMD5 = EncryptUtil.getMD5(sb.toString())
......
......@@ -3,11 +3,14 @@ package com.yidian.common.http
import android.annotation.SuppressLint
import android.app.Activity
import androidx.fragment.app.Fragment
import com.google.gson.Gson
import com.google.gson.JsonParseException
import com.google.gson.reflect.TypeToken
import com.yidian.common.YdBaseApplication
import com.yidian.utils.ToastUtil
import io.reactivex.rxjava3.core.Observer
import io.reactivex.rxjava3.disposables.Disposable
import kotlin.reflect.typeOf
abstract class HttpResultSubscriber<T>(private var showProgress: Boolean = false) : Observer<HttpResult<T>?> {
private var isShowErrorMsg = true
......@@ -45,12 +48,20 @@ abstract class HttpResultSubscriber<T>(private var showProgress: Boolean = false
onRequestFailure(Exception(e.toString()))
}
override fun onNext(result: HttpResult<T>?) {
if (result?.code == 0) {
onRequestSuccess(result)
override fun onNext(res: HttpResult<T>?) {
if (res?.code == 0) {
// val result = res.result as String
// val resultObj = Gson().fromJson<T>(result, object: TypeToken<T>(){}.type)
// val decodeResult = HttpResult<T>()
// decodeResult.code = res.code
// decodeResult.reason = res.reason
// decodeResult.status = res.status
// decodeResult.result = resultObj
// onRequestSuccess(decodeResult)
onRequestSuccess(res)
}else{
onFailer(result)
ToastUtil.showToast(YdBaseApplication.context, result?.reason)
onFailer(res)
ToastUtil.showToast(YdBaseApplication.context, res?.reason)
}
}
......
package com.yidian.common.http
import android.content.Context
interface IBaseView {
object LifeEvent {
const val CREATE = 0x01
const val START = 0x02
const val RESUME = 0x03
const val PAUSE = 0x04
const val STOP = 0x05
const val DESTROY = 0x06
}
/**
* 获取上下文对象
*
* @return
*/
val context: Context
/**
* 显示进度条
*
* @param message 要显示的信息
*/
fun showLoading(message: String?)
/**
* 显示进度条
*/
fun showLoading()
/**
* 隐藏进度条
*/
fun dismissLoading()
}
\ No newline at end of file
......@@ -17,32 +17,11 @@ class URLs {
}
}
const val guestLogin = "/login/login/guest"
const val sendSmsCode = "/login/login/send_sms_code"
const val videoCommentList = "/content/comment/list"
const val videoAddComment = "/content/comment/add"
const val addCollection = "/user/collect/add"
const val delCollection = "/user/collect/del"
const val logout = "/login/login/logout"
const val userInfo = "/user/user/info"
const val userInfoAll = "/user/user/info_all"
const val getExpression = "/content/comment/expression"
const val likeComment = "/content/comment/like"
const val contentDetail = "/content/content/get"
const val articleLike = "/content/thumbsup/thumbsup"
const val authorInfo = "/wemedia/profile/info"
const val authorFlow = "/wemedia/flow/homepage"
const val addSubscribe = "/user/subscribe/add"
const val deleteSubscribe = "/user/subscribe/delete"
const val subscribeFlow = "/flow/subscribe/wm_list"
const val recommendFlow = "/flow/recommend/list"
const val modifyNickname = "/user/user/modify_nickname"
// 生活圈B端
const val uploadFile = "/user/user/modify_profile"
const val collectList = "/user/collect/list"
const val subscribeAuthorList = "/user/subscribe/list"
const val pushTokenAndroid = "/push/token/android"
// 生活圈B端
const val authPersonalGetToken = "/Identify/IdOcr/getBizToken"
const val getKSYunToken = "/ksy/Ksyun/getToken"
const val getIDCardOCR = "Identify/IdOcr/idCardOcr"
......
package com.yidian.common.http.httpbean
import com.yidian.common.http.HttpResult
import com.yidian.common.http.IBaseView
interface IApiCallback: IBaseView {
fun loginCallBack(t: HttpResult<LoginBean.Response?>?)
}
\ No newline at end of file
package com.yidian.common.http.httpbean
class LoginBean (var request : Request,var response : Response){
data class Request(var mobileNo : String, var smsCode : String)
data class Response(var hasBindGatheringCard : String, var token : String)
}
package com.yidian.common.http.httpbean
/**
* FileName: WebResult
* Author: sym
* Date: 2021/3/5 2:26 PM
*/
class WebResult<T>(action: String, data: T) {
var action = action
var params: T? = data
}
\ No newline at end of file
package com.yidian.common.ui.widget
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.viewpager.widget.ViewPager
/**
* @date : 2019-11-19 19:20
* @depiction : 可设置是否滑动的ViewPager
*/
class ScrollViewPager : ViewPager {
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
private var scrollable = false
fun setScrollable(isScrollable: Boolean) {
scrollable = isScrollable
}
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return if (scrollable) {
super.onInterceptTouchEvent(ev)
} else {
scrollable
}
}
@SuppressLint("ClickableViewAccessibility")
override fun onTouchEvent(ev: MotionEvent?): Boolean {
return if (scrollable) {
super.onTouchEvent(ev)
} else {
scrollable
}
}
}
\ No newline at end of file
package com.yidian.common.utils
class ImageConstants {
companion object{
const val IMAGE_SERVER_NEW = "http://i3.go2yd.com/image/"
const val IMAGE_SERVER_SHORT_I3 = "i3.go2yd.com"
const val IMAGE_SERVER_SHORT_I1 = "i1.go2yd.com"
}
}
\ No newline at end of file
......@@ -15,7 +15,6 @@ import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig
import com.yidian.common.XRouterPathConstants
import com.yidian.common.http.httpbean.WebResult
import com.yidian.common.services.XEventService
import com.yidian.utils.MD5Util
import com.yidian.xarc.xbrid.XBridManager
......@@ -127,25 +126,6 @@ object ToolsUtil {
} else false
}
//web交互
fun directSend(str: String, content: String, webView: XWebView) {
val tempData = Gson().fromJson(content, JsonObject::class.java)
val webResult = WebResult(str, tempData)
val temp = JSONObject(Gson().toJson(webResult))
XBridManager.postEvent("CommentService", temp, webView)
}
fun isLogin(): Boolean {
return if (Hawk.get(HawkConfig.LoginStatus, false)) {
true
} else {
val paramsMap = HashMap<String, String>()
paramsMap["popName"] = XRouterPathConstants.NEWS_CONTENT
XPageManager.push(XRouterPathConstants.LOGIN, paramsMap)
false
}
}
fun getYDEncryptionToken(): String {
val temp = StringBuilder()
//架构组提供的设备指纹
......
package com.yidian.common.utils
import android.content.Context
import android.graphics.Typeface
import com.yidian.common.YdBaseApplication
import kotlin.concurrent.thread
class TypefaceUtil {
companion object{
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){
TypefaceUtil()
}
}
var typeface:Typeface? = null
fun initTypeface(context: Context) {
// typeface= Typeface.createFromAsset(context.assets,"font/SourceHanSerifCN-Bold-2.otf")
// typeface= Typeface.createFromAsset(context.assets,"font/DIN Alternate Bold.ttf")
}
}
\ No newline at end of file
package com.yidian.common.widget
import android.content.Context
import android.content.res.AssetManager
import android.graphics.Typeface
import android.util.AttributeSet
import com.yidian.nightmode.widget.YdTextView
class NumberFontTextView @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyle: Int = 0
) : YdTextView(context, attributeSet, defStyle) {
init {
val typeface= Typeface.createFromAsset(context.assets,"font/DINPro-Bold.ttf")
setTypeface(typeface)
}
}
\ No newline at end of file
package com.yidian.common.widget
import android.content.Context
import android.graphics.Canvas
import android.graphics.Paint
import android.graphics.Rect
import android.util.AttributeSet
import com.yidian.common.R
import com.yidian.common.utils.TypefaceUtil
import com.yidian.common.utils.YdUiUtils
import com.yidian.nightmode.widget.YdTextView
class TextFontTextView @JvmOverloads constructor(
context: Context,
attributeSet: AttributeSet? = null,
defStyle: Int = 0
) : YdTextView(context, attributeSet, defStyle) {
private val TAG = "TextFontTextView"
private val rect by lazy { Rect() }
private var showUnderLine = false
var underLineHeight = YdUiUtils.dip2px(9,context)
set(value) {
field = YdUiUtils.dip2px(value,context)
}
private val underRect:Rect by lazy { Rect() }
private val underPaint:Paint by lazy { Paint() }
init {
typeface = TypefaceUtil.instance.typeface
}
fun showUnderLine(){
showUnderLine = true
invalidate()
}
fun hideUnderLine(){
showUnderLine = false
invalidate()
}
override fun onDraw(canvas: Canvas?) {
if (showUnderLine) {
paint.getTextBounds(text.toString(),0,text.length,rect)
underPaint.color = context.resources.getColor(R.color.mainYellowColor)
underPaint.style = Paint.Style.FILL
underRect.bottom = baseline+paint.fontMetrics.descent.toInt()
underRect.left = 0
underRect.top = baseline+paint.fontMetrics.descent.toInt()-underLineHeight
underRect.right = rect.right
canvas?.drawRect(underRect,underPaint)
}
super.onDraw(canvas)
}
}
\ No newline at end of file
package com.yidian.common.widget.chameleon;
import android.content.Context;
import com.yidian.chameleon.annotation.BindingData;
import com.yidian.chameleon.annotation.SetAttribute;
import com.yidian.chameleon.annotation.ViewParserFactory;
import com.yidian.chameleon.value.base.BooleanValueParser;
import com.yidian.chameleon.value.base.IntegerValueParser;
import com.yidian.chameleon.value.common.CommonColorValueParser;
import com.yidian.chameleon.value.common.CommonTextViewStringValueParser;
import com.yidian.nightmode_basic_widget.helper.NMTextColorResHelper;
import com.yidian.nightmode_basic_widget.parser.NMBaseViewParser;
@ViewParserFactory(viewName = "SubwayRichLabel", category = "YDSubway")
public class SubwayRichParser extends NMBaseViewParser<SubwayRichTextViewGroup> {
@BindingData
public void bindData(SubwayRichTextViewGroup view, String value, CommonTextViewStringValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setValue(valueParser.apply(value));
}
}
@SetAttribute("clickable")
public void setClickable(SubwayRichTextViewGroup view, String value, BooleanValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewClickable(valueParser.apply(value));
}
}
@SetAttribute("textColor")
public void setTextColor(SubwayRichTextViewGroup view, String value, CommonColorValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
if (valueParser.canAppliedTo(value)) {
view.setViewTextColor(valueParser.apply(value));
((NMTextColorResHelper.IResSetter) view).setTextColorResValue(value);
}
}
}
@SetAttribute("textSize")
public void setTextSize(SubwayRichTextViewGroup view, String value, IntegerValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewTextSize(valueParser.apply(value));
}
}
@SetAttribute("fontStyle")
public void setFontStyle(SubwayRichTextViewGroup view, String value, CommonTextViewStringValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewFontStyle(valueParser.apply(value));
}
}
@SetAttribute("cornerText")
public void setCornerText(SubwayRichTextViewGroup view, String value, CommonTextViewStringValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewCornerText(valueParser.apply(value));
}
}
@SetAttribute("cornerTextColor")
public void setCornerTextColor(SubwayRichTextViewGroup view, String value, CommonColorValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewCornerTextColor(valueParser.apply(value));
}
}
@SetAttribute("cornerTextSize")
public void setCornerTextSize(SubwayRichTextViewGroup view, String value, IntegerValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setViewCornerTextSize(valueParser.apply(value));
}
}
@SetAttribute("maxLines")
public void setMaxLines(SubwayRichTextViewGroup view, String value, IntegerValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setMaxLines(valueParser.apply(value));
}
}
@SetAttribute("showCornerAlways")
public void setShowCornerAlways(SubwayRichTextViewGroup view, String value, BooleanValueParser valueParser) {
if (valueParser.canAppliedTo(value)) {
view.setShowCornerAlways(valueParser.apply(value));
}
}
@Override
public SubwayRichTextViewGroup createView(Context context) {
return new SubwayRichTextViewGroup(context);
}
}
package com.yidian.common.widget.chameleon;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.style.ClickableSpan;
import android.text.style.TextAppearanceSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.NonNull;
import com.yidian.common.R;
import com.yidian.nightmode.widget.YdFrameLayout;
import com.yidian.nightmode_basic_widget.helper.NMBgResHelper;
import com.yidian.nightmode_basic_widget.helper.NMTextColorResHelper;
import com.yidian.nightmode_basic_widget.parser.value.NMColorResValueParser;
public class SubwayRichTextViewGroup extends YdFrameLayout implements NMTextColorResHelper.IResSetter, NMBgResHelper.IResSetter {
private static final String TAG = "SubwayRichTextViewGroup";
private SubwayRichTextView richTextView;
public SubwayRichTextViewGroup(Context context) {
super(context);
init(context, null);
}
public SubwayRichTextViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public SubwayRichTextViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
public void init(Context context, AttributeSet attrs) {
richTextView = new SubwayRichTextView(context);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT);
richTextView.setLayoutParams(layoutParams);
addView(richTextView);
}
private String data;
public void setValue(String data) {
this.data = data;
richTextView.setMaxLines( richTextView.getMaxLines());
richTextView.setEllipsize(TextUtils.TruncateAt.END);
setContent(data);
}
private void setContent(String data) {
richTextView.setOriginalData(data);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(data);
ColorStateList contentColorStateList;
contentColorStateList = ColorStateList.valueOf(richTextView.getTextColor());
TextAppearanceSpan contentSpan = new TextAppearanceSpan("default", Typeface.NORMAL,
(int) richTextView.getTextSize(),
contentColorStateList,
null);
strBuilder.setSpan(contentSpan, 0, strBuilder.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (richTextView.isClickable()) {
addSuffix(strBuilder);
}
richTextView.setText(strBuilder);
}
private void addSuffix(SpannableStringBuilder strBuilder) {
SpannableString suffix = new SpannableString(richTextView.getSUFFIX());
TextAppearanceSpan suffixSpan = new TextAppearanceSpan("default", Typeface.NORMAL,
(int) richTextView.getViewCornerTextSize(),
ColorStateList.valueOf(richTextView.getCornerTextColor()),
null);
suffix.setSpan(suffixSpan, 0, suffix.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ExpandSpan clickSpan = new ExpandSpan(richTextView.getCornerTextColor());
suffix.setSpan(clickSpan,0, suffix.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
richTextView.setSuffix(suffix);
strBuilder.append(" ");
strBuilder.append(suffix);
clickSpan.setOnRichClickListener(() -> {
Log.e(TAG, "addSuffix: 折叠 展开 " );
});
}
public void setViewClickable(Boolean apply) {
richTextView.setViewClickable(apply);
}
public void setViewTextColor(Integer apply) {
if (apply != 0) {
richTextView.setViewTextColor(apply);
}
}
public void setViewTextSize(Integer apply) {
richTextView.setViewTextSize(apply);
}
public void setViewFontStyle(String apply) {
}
public void setViewCornerText(String apply) {
richTextView.setViewCornerText(apply);
}
public void setViewCornerTextColor(Integer apply) {
richTextView.setViewCornerTextColor(apply);
}
public void setViewCornerTextSize(Integer apply) {
richTextView.setViewCornerTextSize(apply);
}
public void setMaxLines(Integer apply) {
richTextView.setMaxLines(apply);
}
private void setViewShowCornerAlways(Boolean apply) {
richTextView.setViewShowCornerAlways(apply);
}
NMColorResValueParser nmColorResValueParser;
String valueStr;
@Override
public void setTextColorResValue(String s) {
if (!TextUtils.isEmpty(s) && s.contains("@")) {
this.valueStr = s;
nmColorResValueParser = new NMColorResValueParser();
setViewTextColor(nmColorResValueParser.apply(valueStr));
}
}
@Override
public void setBgResValue(String s, String s1, String s2) {
}
@Override
public void setTheme(Resources.Theme themeId) {
super.setTheme(themeId);
if (nmColorResValueParser != null) {
setViewTextColor(nmColorResValueParser.apply(valueStr));
setValue(data);
}
}
public void setShowCornerAlways(Boolean apply) {
setViewShowCornerAlways(apply);
}
private static class ExpandSpan extends ClickableSpan {
private int color;
private RichClickListener listener;
public ExpandSpan(int color) {
this.color = color;
}
public void setOnRichClickListener(RichClickListener l){
listener =l;
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(color);
ds.setUnderlineText(false);
}
@Override
public void onClick(@NonNull View widget) {
if (widget instanceof TextView) {
((TextView) widget).setHighlightColor(Color.TRANSPARENT);
if (listener!=null){
listener.onClick();
}
}
}
}
interface RichClickListener{
void onClick();
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".activity.LoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="20dp"
android:hint="请输入账号"
android:text="18900000000"
android:inputType="phone"
android:textSize="18sp"/>
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="20dp"
android:text="123456"
android:hint="请输入密码"
android:textSize="18sp"/>
<Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_margin="20dp"
android:textSize="18sp"
android:text="登录"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/lly_wechat"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher_round"
app:civ_border_width="2dp"
app:civ_border_color="#FF000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textSize="16sp"
android:text="微信"/>
</LinearLayout>
<LinearLayout
android:id="@+id/lly_qq"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher_round"
app:civ_border_width="2dp"
app:civ_border_color="#FF000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textSize="16sp"
android:text="QQ"/>
</LinearLayout>
<LinearLayout
android:id="@+id/lly_sina"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<de.hdodenhof.circleimageview.CircleImageView
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:src="@mipmap/ic_launcher_round"
app:civ_border_width="2dp"
app:civ_border_color="#FF000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textSize="16sp"
android:text="微博"/>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context=".activity.OneKeyLoginActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:orientation="vertical"
android:gravity="center">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv_phoneNo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:textColor="#000000"
android:textSize="22sp"
android:text="189****0000" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#a9a9a9"
android:textSize="12sp"
android:text="中国移动提供认证服务" />
<Button
android:id="@+id/btn_oneKeyLogin"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_margin="20dp"
android:background="#1e90ff"
android:textColor="#ffffff"
android:textSize="16sp"
android:text="本机号码一键登录"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#a9a9a9"
android:textSize="14sp"
android:text="不是此号码?使用其他账号" />
<TextView
android:id="@+id/tv_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:textColor="#1e90ff"
android:textSize="14sp"
android:text="登录" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
\ No newline at end of file
......@@ -68,13 +68,8 @@ dependencies {
implementation project(it)
}
implementation rootProject.ext.dependencies.publicImplementation
implementation ('com.yidian.framework.mobile:ydvideo:1.0.0-SNAPSHOT') {
exclude group: 'com.github.bumptech.glide'
}
testImplementation rootProject.ext.dependencies.testImplementation
androidTestImplementation rootProject.ext.dependencies.androidTestImplementation
implementation 'com.yidian.chameleon:annotation:0.3.29'
kapt 'com.yidian.chameleon:annotationcompiler:0.3.29'
implementation files('libs/meglive_still.aar')
implementation project(':idcard_quality')
implementation files('libs/ks3-androidsdk-1.4.9.jar')
......
......@@ -3,7 +3,6 @@
package="com.yidian.shenghuoquan.newscontent">
<application>
<activity android:name=".ui.CommonDetailActivity" />
<activity
android:name=".ui.FlashActivity"
android:theme="@style/FlashTheme">
......@@ -17,10 +16,6 @@
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask" />
<activity
android:name=".ui.HomeActivity"
android:launchMode="singleTask"
android:theme="@style/HomePageTheme"/>
<activity android:name=".ui.DeepLinkActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
......@@ -37,42 +32,11 @@
android:name=".ui.NewsContentActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" />
<activity android:name=".ui.author.AuthorHomePageActivity" />
<activity
android:name=".ui.mine.MineActivity"
android:theme="@style/FlutterTransparent">
<meta-data
android:name="io.flutter.embedding.android.SplashScreenDrawable"
android:resource="@android:color/transparent" />
</activity>
<activity android:name=".ui.mine.BrowsingHistoryActivity" />
<activity android:name=".ui.mine.CollectionActivity" />
<activity android:name=".ui.mine.SubscriptionActivity" />
<activity
android:name=".ui.search.SearchChannelActivity"
android:launchMode="singleTask"
android:theme="@style/Transparent" />
<activity
android:name=".ui.search.SearchResultPageActivity"
android:theme="@style/Transparent" />
<service
android:name=".audio.AudioService"
android:enabled="true"
android:exported="true" />
<activity
android:name=".ui.comment.VideoCommentDetailActivity"
android:launchMode="singleTask"
android:theme="@style/Transparent" />
<activity
android:name=".ui.comment.CommentTestActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.alive.AliveTestActivity"
android:theme="@style/Transparent" />
......
package com.yidian.shenghuoquan.newscontent.action
import com.yidian.common.XRouterPathConstants
import com.yidian.common.YdBaseApplication
import com.yidian.common.chameleon.ChameleonEvent
import com.yidian.common.chameleon.ChameleonEventService
import com.yidian.shenghuoquan.newscontent.ui.NewsContentActivity
import com.yidian.xpage.XPageManager
class ChameleonActionExecutor:ChameleonEventService {
companion object{
const val MODULE_GENERAL = "generalAction"
const val MODULE_CARD = "card"
const val ACTION_SHARE = "share"
const val ACTION_COMMENT = "comment"
const val ACTION_THUMB_UP = "thumb_up"
const val ACTION_GOTO_AUTHOR = "goto_author"
const val ACTION_VIDEO_DETAIL = "video_detail"
const val ACTION_DOC = "doc"
}
private var lastClickTime = 0L
override fun dispatchEvent(event: ChameleonEvent) {
when{
event.module == MODULE_GENERAL && event.action == ACTION_DOC->{
val currentClickTime = System.currentTimeMillis()
if(currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
if (YdBaseApplication.activityList.isEmpty()) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
activity.runOnUiThread {
val paramsMap = hashMapOf<String, Any>(
Pair(NewsContentActivity.ContentType, NewsContentActivity.TextType),
Pair( NewsContentActivity.DocId, event.params?.optString("docid")?:"" )
)
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, paramsMap)
}
}
event.module == MODULE_GENERAL && event.action == ACTION_VIDEO_DETAIL->{
val currentClickTime = System.currentTimeMillis()
if(currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
if (YdBaseApplication.activityList.isEmpty()) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
activity.runOnUiThread {
val paramsMap = hashMapOf<String, Any>(
Pair(NewsContentActivity.ContentType, NewsContentActivity.VideoType),
Pair( NewsContentActivity.DocId, event.params?.optString("docid")?:"" )
)
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, paramsMap)
}
}
event.module == MODULE_CARD && event.action == ACTION_GOTO_AUTHOR->{
val currentClickTime = System.currentTimeMillis()
if(currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
if (YdBaseApplication.activityList.isEmpty()) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
activity.runOnUiThread {
val paramsMap = hashMapOf<String, Any>(
Pair( "fromId", event.params?.optString("fromId")?:"" )
)
XPageManager.push(XRouterPathConstants.AUTHOR_HOME_PAGE, paramsMap)
}
}
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.DynamicExpressionBean
import com.yidian.shenghuoquan.newscontent.ui.comment.EmotionGifPanelView
class GifGridViewAdapter(emotionList: List<DynamicExpressionBean.Result>, page: Int) : BaseAdapter() {
private var emotionList = ArrayList<DynamicExpressionBean.Result>()
init {
var start = page * EmotionGifPanelView.ITEM_GRID_NUM
val end = start + EmotionGifPanelView.ITEM_GRID_NUM
while (start < emotionList.size && start < end) {
this.emotionList.add(emotionList[start])
start++
}
}
override fun getCount(): Int {
return emotionList.size
}
override fun getItem(p0: Int): Any {
return emotionList[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
@SuppressLint("InflateParams")
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view: View?
val myHolder: MyHolder?
if (convertView == null) {
myHolder = MyHolder()
view = LayoutInflater.from(parent!!.context).inflate(R.layout.item_gif_gridview, null)
myHolder.image = view.findViewById(R.id.iv_img)
myHolder.text = view.findViewById(R.id.gif_text)
view.tag = myHolder
} else {
view = convertView
myHolder = view.tag as MyHolder
}
Glide.with(parent!!.context)
.setDefaultRequestOptions(RequestOptions().frame(1000000))
.load(emotionList[position].url)
.into(myHolder.image)
myHolder.text.text = emotionList[position].content.replace("#GIF#", "")
return view!!
}
inner class MyHolder {
lateinit var image: ImageView
lateinit var text: TextView
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.adapter
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import com.yidian.nightmode.widget.YdImageView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.ui.comment.Emotion
import com.yidian.shenghuoquan.newscontent.ui.comment.EmotionHelper
import com.yidian.shenghuoquan.newscontent.ui.comment.EmotionPanelView
class GridViewAdapter(emotionList: ArrayList<Emotion>, page: Int, private var dir: String) : BaseAdapter() {
private var emotionList = ArrayList<Emotion>()
init {
var start = page * EmotionPanelView.ITEM_GRID_NUM
val end = start + EmotionPanelView.ITEM_GRID_NUM
while (start < emotionList.size && start < end) {
this.emotionList.add(emotionList[start])
start++
}
}
override fun getCount(): Int {
return emotionList.size
}
override fun getItem(p0: Int): Any {
return emotionList[p0]
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
@SuppressLint("InflateParams")
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view: View?
val myHolder: MyHolder?
if (convertView == null) {
myHolder = MyHolder()
view = LayoutInflater.from(parent!!.context).inflate(R.layout.item_gridview, null)
myHolder.image = view.findViewById(R.id.iv_img)
view.tag = myHolder
} else {
view = convertView
myHolder = view.tag as MyHolder
}
when {
emotionList[position].getRes().equals("delete") -> {
myHolder.image.setBackgroundResource(R.mipmap.delete_emotion)
}
emotionList[position].getRes().equals("null") -> {
}
else -> {
if (emotionList[position].getRes() != null) {
val path = dir + "/" + emotionList[position].getRes()
myHolder.image.setImageDrawable(EmotionHelper.getDrawable(path))
emotionList[position].path = path
}
}
}
return view!!
}
inner class MyHolder {
lateinit var image: YdImageView
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.SearchHintBean
import com.yidian.shenghuoquan.newscontent.holder.NormalHintViewHolder
import com.yidian.shenghuoquan.newscontent.ui.search.SearchChannelActivity
import com.yidian.shenghuoquan.newscontent.ui.search.SearchChannelActivity.Companion.SEARCH_TAG
import com.yidian.shenghuoquan.newscontent.ui.search.SearchResultPageActivity
import com.yidian.common.utils.ToolsUtil
class SearchHintAdapter(val context: Context) :
RecyclerView.Adapter<NormalHintViewHolder>() {
private var hintDataList: MutableList<SearchHintBean> = mutableListOf()
private lateinit var addDataListener: SearchChannelActivity.HintListener
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NormalHintViewHolder {
val view = LayoutInflater.from(context).inflate(
R.layout.item_view_search_hint,
parent,
false
)
return NormalHintViewHolder(view)
}
override fun onBindViewHolder(holder: NormalHintViewHolder, position: Int) {
val channel = hintDataList[position]
holder.setData(channel)
holder.setOnItemListener(object : HolderListener {
override fun itemClick() {
if (ToolsUtil.isFastClick) {
if (context is SearchChannelActivity) {
val intent = Intent(context, SearchResultPageActivity::class.java)
intent.putExtra(SEARCH_TAG, hintDataList[position].content)
context.startActivity(intent)
}
addDataListener.itemClick(hintDataList[position].content)
}
}
})
}
override fun getItemCount(): Int {
return hintDataList.size
}
fun setData(hintDataList: MutableList<SearchHintBean>) {
this.hintDataList = hintDataList
notifyDataSetChanged()
}
fun setHintListener(addDataListener: SearchChannelActivity.HintListener) {
this.addDataListener = addDataListener
}
interface HolderListener {
fun itemClick()
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.adapter
import android.content.Context
import android.content.Intent
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.orhanobut.hawk.Hawk
import com.yidian.common.HawkConfig
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.holder.SearchHistoryViewHolder
import com.yidian.shenghuoquan.newscontent.ui.search.SearchChannelActivity
import com.yidian.shenghuoquan.newscontent.ui.search.SearchChannelActivity.Companion.SEARCH_TAG
import com.yidian.shenghuoquan.newscontent.ui.search.SearchResultPageActivity
import com.yidian.common.utils.ToolsUtil
class SearchHistoryAdapter(val context: Context) : RecyclerView.Adapter<SearchHistoryViewHolder>() {
private lateinit var historyListener: SearchChannelActivity.HistoryListener
var dataList: MutableList<String> = mutableListOf()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchHistoryViewHolder {
val view = LayoutInflater.from(context).inflate(
R.layout.item_view_search_history,
parent,
false
)
return SearchHistoryViewHolder(view)
}
override fun onBindViewHolder(holder: SearchHistoryViewHolder, position: Int) {
if (dataList.isNotEmpty()) {
val itemData = dataList[position]
holder.setData(itemData)
holder.setOnItemListener(object : HolderListener {
override fun delete() {
dataList.removeAt(position)
if (dataList.isEmpty()) {
historyListener.dismiss()
Hawk.delete(HawkConfig.SearchHistory)
} else {
historyListener.deleteData(dataList)
}
notifyDataSetChanged()
}
override fun itemClick() {
if (ToolsUtil.isFastClick) {
if (context is SearchChannelActivity) {
val intent = Intent(context, SearchResultPageActivity::class.java)
intent.putExtra(SEARCH_TAG, dataList[position])
context.startActivity(intent)
}
historyListener.itemClick(dataList[position])
}
}
})
}
}
override fun getItemCount(): Int {
return if (dataList.size > 5) 5 else dataList.size
}
@JvmName("setData1")
fun setData(searchData: MutableList<String>) {
this.dataList = searchData
notifyDataSetChanged()
}
fun setHistoryListener(historyListener: SearchChannelActivity.HistoryListener) {
this.historyListener = historyListener
}
interface HolderListener {
fun delete()
fun itemClick()
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.holder
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.newscontent.adapter.SearchHintAdapter
import com.yidian.shenghuoquan.newscontent.bean.SearchHintBean
import kotlinx.android.synthetic.main.item_view_search_hint.view.*
class NormalHintViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private var currentData: SearchHintBean? = null
private lateinit var listener: SearchHintAdapter.HolderListener
init {
itemView.setOnClickListener {
listener.itemClick()
}
}
fun setData(data: SearchHintBean) {
// itemView.search_test.text = channel.title
this.currentData = data
itemView.search_hint_content.text = data.content
}
fun setOnItemListener(listener: SearchHintAdapter.HolderListener) {
this.listener = listener
}
}
package com.yidian.shenghuoquan.newscontent.holder
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.newscontent.adapter.SearchHistoryAdapter
import kotlinx.android.synthetic.main.item_view_search_history.view.*
class SearchHistoryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private lateinit var listener: SearchHistoryAdapter.HolderListener
init {
itemView.imv_icon.setOnClickListener {
listener.delete()
}
itemView.setOnClickListener {
listener.itemClick()
}
}
fun setData(data: String) {
itemView.txv_channel_name.text = data
}
fun setOnItemListener(deleteListener: SearchHistoryAdapter.HolderListener) {
listener = deleteListener
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
import com.yidian.common.http.URLs
import com.yidian.shenghuoquan.newscontent.bean.CreateLifeAccountBean
......@@ -11,86 +10,6 @@ import retrofit2.Call
import retrofit2.http.*
interface CommonService {
@Headers("Content-Type: application/json")
@POST(URLs.guestLogin)
fun guestLogin(@QueryMap commonParams: Map<String, String>, @Body requestParams: GuestLoginBean.Request): Observable<HttpResult<GuestLoginBean.Response?>>
@GET(URLs.sendSmsCode)
fun sendSmsCode(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.logout)
fun logout(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.videoCommentList)
fun videoCommentList(@QueryMap commonParams: Map<String, String>, @Body requestParams: VideoCommentBean.Request): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.videoAddComment)
fun videoAddComment(@QueryMap commonParams: Map<String, String>, @Body requestParams: VideoAddCommentBean.Request): Observable<HttpResult<Any?>>
@GET(URLs.addCollection)
fun collection(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.delCollection)
fun delCollection(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.userInfo)
fun userInfo(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.userInfoAll)
fun userInfoAll(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.getExpression)
fun getExpression(@QueryMap commonParams: Map<String, String>): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.likeComment)
fun likeComment(@QueryMap commonParams: Map<String, String>, @Body requestParams: LikeCommentBean.Request): Observable<HttpResult<LikeCommentBean.Response?>>
@GET(URLs.contentDetail)
fun getContentDetail(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@GET(URLs.contentDetail)
fun getVideoContentDetail(@QueryMap commonParams: Map<String, String>,@QueryMap requestParams: Map<String, String>): Observable<HttpResult<MutableList<VideoContentDetailBean>?>>
@GET(URLs.articleLike)
fun articleLike(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.authorInfo)
fun getAuthorInfo(@QueryMap commonParams: Map<String, String>, @Body requestParams: AuthorInfoBean.Request): Observable<HttpResult<AuthorInfoBean.Response?>>
@Headers("Content-Type: application/json")
@POST(URLs.authorFlow)
fun getAuthorFlow(@QueryMap commonParams: Map<String, String>, @Body requestParams: AuthorFlowBean.Request): Observable<HttpResult<ArrayList<PolymerCommonCardBean>?>>
@Headers("Content-Type: application/json")
@POST(URLs.addSubscribe)
fun addSubscribe(@QueryMap commonParams: Map<String, String>, @Body requestParams: AddSubscribeBean.Request): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.deleteSubscribe)
fun deleteSubscribe(@QueryMap commonParams: Map<String, String>, @Body requestParams: DeleteSubscribeBean.Request): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.subscribeFlow)
fun getSubscribeFlow(@QueryMap commonParams: Map<String, String>, @Body requestParams: FlowBean.Request): Observable<HttpResult<ArrayList<PolymerCommonCardBean>?>>
@Headers("Content-Type: application/json")
@POST(URLs.recommendFlow)
fun getRecommendFlow(@QueryMap commonParams: Map<String, String>, @Body requestParams: FlowBean.Request): Observable<HttpResult<ArrayList<PolymerCommonCardBean>?>>
@GET(URLs.modifyNickname)
fun modifyNickname(@QueryMap commonParams: Map<String, String>, @QueryMap requestParams: Map<String, String>): Observable<HttpResult<Any?>>
@Headers("Content-Type: application/json")
@POST(URLs.collectList)
fun getCollectList(@QueryMap commonParams: Map<String, String>, @Body requestParams: FlowBean.Request): Observable<HttpResult<ArrayList<PolymerCommonCardBean>?>>
@Headers("Content-Type: application/json")
@POST(URLs.subscribeAuthorList)
fun getSubscribeAuthorList(@QueryMap commonParams: Map<String, String>, @Body requestParams: SubscribeAuthorFlowBean.Request): Observable<HttpResult<ArrayList<PolymerCommonCardBean>?>>
@Multipart
@POST(URLs.uploadFile)
fun uploadFile(@QueryMap commonParams: Map<String, String>, @Part part: MultipartBody.Part): Observable<HttpResult<Any?>>
......
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.chameleon.control.ResourceManager
class AuthorFlowBean(var request: Request) {
data class Request(
var wm_id: String, var nav: String, var page: Int,
var package_version: String = ResourceManager.getInstance().currentVersion
)
}
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.chameleon.control.ResourceManager
class FlowBean(var request: Request) {
data class Request(
var action_type: Int,
var page: Int,
var page_size: Int,
var package_version: String = ResourceManager.getInstance().currentVersion
)
}
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.http.HttpResult
import com.yidian.common.http.httpbean.LoginBean
interface IApiCallback {
fun loginCallBack(t: HttpResult<LoginBean.Response?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
interface IAuthorFlowCallback {
fun authorFlowCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
interface ICollectionListCallback {
fun collectionListCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
interface IFlowCallback {
fun subscribeFlowCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
fun recommendFlowFlowCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
interface ISubscribeAuthorListCallback {
fun subscribeAuthorFlowCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
interface ISubscribeListCallback {
fun subscribeListCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.http.httpbean
import com.yidian.chameleon.control.ResourceManager
class SubscribeAuthorFlowBean(var request: Request) {
data class Request(
var type: String,
var page: Int,
var page_size: Int,
var package_version: String = ResourceManager.getInstance().currentVersion
)
}
package com.yidian.shenghuoquan.newscontent.service
import com.yidian.common.XEventConfig
import com.yidian.common.YdBaseApplication
import com.yidian.common.services.XEventService
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthorBean
import com.yidian.shenghuoquan.newscontent.subscription.subscriptionManager
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.yac.core.zap.ZapService
import org.json.JSONObject
class ArticleService: ZapService(){
companion object{
const val serviceName: String = "ArticleService"
}
private lateinit var resolver: ResultResolver
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
params as JSONObject
when(action){
"scrollSettingBarInfo" -> scrollSettingBar(params)
"updateBarSubscribeStatus" -> setBarSubscribeStatus(params)
"scrollSettingBottomBarInfo" -> scrollSettingBottomBarInfo(params)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun scrollSettingBar(params: JSONObject){
val status = params.optBoolean("status")
val xbaseEvent = XBaseEvent(XEventConfig.SCROLL_SETTING_BAR, status)
XEventService.postEvent(xbaseEvent)
}
private fun setBarSubscribeStatus(params: JSONObject){
val status = params.optBoolean("status")
val fromId = params.optString("fromId")
val avatar = params.optString("avatar")
if (YdBaseApplication.activityList.isEmpty()) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
activity.runOnUiThread {
subscriptionManager.getAuthorSubscribedListFromLocal(status, AuthorBean(wm_id = fromId,image = avatar))
}
}
private fun scrollSettingBottomBarInfo(params: JSONObject){
val status = params.optBoolean("status")
val xbaseEvent = XBaseEvent(XEventConfig.SCROLL_SETTING_BOTTOM_BAR_STATUS, status)
XEventService.postEvent(xbaseEvent)
}
}
\ No newline at end of file
......@@ -2,7 +2,6 @@ package com.yidian.shenghuoquan.newscontent.service
import com.yidian.common.XRouterPathConstants
import com.yidian.shenghuoquan.newscontent.ui.NewsContentActivity
import com.yidian.shenghuoquan.newscontent.ui.author.AuthorHomePageActivity
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapService
......@@ -53,7 +52,5 @@ class DeepLinkService: ZapService(){
private fun jumpAuthorHomePage(params: JSONObject){
val fromId = params.optString("fromid")
val paramsMap = HashMap<String, Any?>()
paramsMap[AuthorHomePageActivity.FromId] = fromId
XPageManager.push(XRouterPathConstants.AUTHOR_HOME_PAGE, paramsMap)
}
}
\ No newline at end of file
......@@ -2,17 +2,11 @@ package com.yidian.shenghuoquan.newscontent.service
import android.graphics.Bitmap
import com.google.gson.Gson
import com.orhanobut.hawk.Hawk
import com.yidian.common.AppConfig
import com.yidian.common.HawkConfig
import com.yidian.common.YdBaseApplication
import com.yidian.common.http.HttpResult
import com.yidian.common.http.URLs
import com.yidian.common.utils.ToolsUtil
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
import com.yidian.shenghuoquan.newscontent.subscription.subscriptionManager
import com.yidian.shenghuoquan.newscontent.utils.AccountUtil
import com.yidian.shenghuoquan.newscontent.http.httpbean.IUploadFileCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.IUserInfoCallback
import com.yidian.shenghuoquan.newscontent.utils.UploadFileUtils
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.yac.core.zap.ZapService
......@@ -61,37 +55,6 @@ class RequestService : ZapService() {
}
private val guestLoginImpl = object : IGuestLoginCallback {
override fun guestLoginCallBack(t: HttpResult<GuestLoginBean.Response?>?) {
if (t?.code == 0) {
val loginBean = t.result
Hawk.put(HawkConfig.GuestAccountUsername, loginBean?.username)
Hawk.put(HawkConfig.Username, loginBean?.username)
Hawk.put(HawkConfig.Nickname, loginBean?.nickname)
Hawk.put(HawkConfig.ProfileUrl, loginBean?.profile_url)
}
}
}
private fun guestLogin() {
val username = AccountUtil.getGuestUsername()
val password = AccountUtil.getPassword(username)
val tok = AccountUtil.getToken(username, password)
val requestBean = GuestLoginBean.Request(username, password, tok)
ApiService.guestLogin(guestLoginImpl, requestBean)
}
private val videoContentImpl = object : IVideoContentCallback {
override fun videoContentDetailCallback(t: HttpResult<MutableList<VideoContentDetailBean>?>?) {
}
override fun videoCommentCallback(t: HttpResult<Any?>?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
}
private val userInfoImpl = object : IUserInfoCallback {
override fun userInfoCallback(t: HttpResult<Any?>?) {
val params = Gson().toJson(t)
......@@ -104,64 +67,44 @@ class RequestService : ZapService() {
}
}
private val likeCommentImpl = object : GeneralCallback {
override fun generalCallback(t: HttpResult<LikeCommentBean.Response?>?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
}
private val subscribeImpl = object : ISubscribeCallback {
override fun addSubscribeCallBack(t: HttpResult<Any?>?, bean: AuthorBean?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
override fun deleteCallBack(t: HttpResult<Any?>?, bean: AuthorBean?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
}
private fun requestApi(path: String, params: JSONObject) {
when (path) {
URLs.videoCommentList -> {
val docId = params.optString("docid")
val pageSize = params.optInt("page_size")
val page = params.optInt("page")
val videoCommentRequest = VideoCommentBean.Request(docId, pageSize, page)
ApiService.videoCommentList(videoContentImpl, videoCommentRequest)
}
URLs.userInfo -> {
ApiService.userInfo(userInfoImpl)
}
URLs.modifyNickname -> {
val nickname = params.optString("nickname")
val requestMap = HashMap<String, String>()
requestMap["nickname"] = nickname
ApiService.modifyNickname(userInfoImpl, requestMap)
}
URLs.likeComment -> {
val docId = params.optString("docid")
val commentId = params.optString("comment_id")
val status = params.optInt("status")
val likeRequest = LikeCommentBean.Request(docId, commentId, status)
ApiService.likeComment(likeCommentImpl, likeRequest)
}
URLs.addSubscribe -> {
val type = params.optInt("type")
val subscribeId = params.optString("subscribe_id")
val subscribeBean = AddSubscribeBean.Request(type, subscribeId)
ApiService.addSubscribe(subscribeImpl, subscribeBean)
}
URLs.deleteSubscribe -> {
val type = params.optInt("type")
val subscribeIds = params.optString("subscribe_ids")
val subscribeBean = DeleteSubscribeBean.Request(type, subscribeIds)
ApiService.deleteSubscribe(subscribeImpl, subscribeBean)
}
}
// when (path) {
// URLs.videoCommentList -> {
// val docId = params.optString("docid")
// val pageSize = params.optInt("page_size")
// val page = params.optInt("page")
// val videoCommentRequest = VideoCommentBean.Request(docId, pageSize, page)
// ApiService.videoCommentList(videoContentImpl, videoCommentRequest)
// }
// URLs.userInfo -> {
// ApiService.userInfo(userInfoImpl)
// }
// URLs.modifyNickname -> {
// val nickname = params.optString("nickname")
// val requestMap = HashMap<String, String>()
// requestMap["nickname"] = nickname
// ApiService.modifyNickname(userInfoImpl, requestMap)
// }
// URLs.likeComment -> {
// val docId = params.optString("docid")
// val commentId = params.optString("comment_id")
// val status = params.optInt("status")
// val likeRequest = LikeCommentBean.Request(docId, commentId, status)
// ApiService.likeComment(likeCommentImpl, likeRequest)
// }
// URLs.addSubscribe -> {
// val type = params.optInt("type")
// val subscribeId = params.optString("subscribe_id")
// val subscribeBean = AddSubscribeBean.Request(type, subscribeId)
// ApiService.addSubscribe(subscribeImpl, subscribeBean)
// }
// URLs.deleteSubscribe -> {
// val type = params.optInt("type")
// val subscribeIds = params.optString("subscribe_ids")
// val subscribeBean = DeleteSubscribeBean.Request(type, subscribeIds)
// ApiService.deleteSubscribe(subscribeImpl, subscribeBean)
// }
// }
}
private val uploadFileCallback = object : IUploadFileCallback {
......
package com.yidian.shenghuoquan.newscontent.subscription
interface AuthorSubscription<T> {
/**
* 作者订阅
*/
fun subscribeAuthor(bean:T){}
/**
* 取消订阅
*/
fun unsubscribeAuthor(bean:T){}
fun updateSubscribeStatus(bean:T)
fun needUpdateSubscribeStatus(bean:T):Boolean
fun getAuthorBean():T?
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.subscription
import com.google.gson.Gson
import com.yidian.common.YdBaseApplication
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.common.http.HttpResult
import com.yidian.common.utils.YdToastUtil
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.httpbean.*
import java.util.*
val subscriptionManager: SubscriptionManager by lazy { SubscriptionManager.instance }
class SubscriptionManager private constructor() {
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { SubscriptionManager() }
private const val STATUS_DEFAULT = 0
private const val STATUS_LOADING = 1
private const val STATUS_FAILED = 2
private const val STATUS_SUCCESS = 3
}
private val authorSubscriptionList: ArrayList<AuthorSubscription<AuthorBean>> by lazy { ArrayList<AuthorSubscription<AuthorBean>>() }
private val authorBeanList = LinkedList<AuthorBean>()
private var needUpdateListEveryTime = false
private var currentStatus = STATUS_DEFAULT
private val subCallback = object : ISubscribeCallback {
override fun addSubscribeCallBack(t: HttpResult<Any?>?, bean: AuthorBean?) {
if (t?.code == 0) {
//订阅成功
getAuthorSubscribedList(true, bean)
}
}
override fun deleteCallBack(t: HttpResult<Any?>?, bean: AuthorBean?) {
if (t?.code == 0) {
//取消订阅成功
getAuthorSubscribedList(false, bean)
}
}
}
fun initAuthorSubscribeList() {
getAuthorSubscribedListFromNet()
}
fun addAuthorSubscription(authorSubscription: AuthorSubscription<AuthorBean>) {
if (authorSubscriptionList.contains(authorSubscription)) return
authorSubscriptionList.add(authorSubscription)
val authorBean = authorSubscription.getAuthorBean() ?: return
val target = authorBeanList.find { authorBean.wm_id == it.wm_id }
?: AuthorBean(wm_id = authorBean.wm_id)
val needUpdateSubscribeStatus =authorSubscription.needUpdateSubscribeStatus(target)
if (needUpdateSubscribeStatus) {
authorSubscription.updateSubscribeStatus(target)
}
}
fun removeAuthorSubscription(authorSubscription: AuthorSubscription<*>) {
authorSubscriptionList.remove(authorSubscription)
}
fun getAuthorSubscribedList(isSubscribe: Boolean, bean: AuthorBean?) {
//是否有多端登录的情况,暂时先维护本地列表来处理
if (needUpdateListEveryTime) {
getAuthorSubscribedListFromNet()
} else {
getAuthorSubscribedListFromLocal(isSubscribe, bean)
}
}
fun getAuthorSubscribedListFromLocal(subscribe: Boolean, bean: AuthorBean?) {
if (bean == null || bean.wm_id.isNullOrEmpty()) return
if (subscribe) {
val newBean = bean.clone().also { it.is_subscribed = true }
authorBeanList.add(newBean)
YdToastUtil.showToast(YdBaseApplication.context,"感谢您的订阅!", bean.image ?:"")
} else {
val target = authorBeanList.find { it.wm_id == bean.wm_id } ?: return
authorBeanList.remove(target)
}
updateSubscribeStatus()
}
private fun updateSubscribeStatus() {
authorSubscriptionList.forEach { authorSubscriber ->
val authorBean = authorSubscriber.getAuthorBean() ?: return@forEach
val target = authorBeanList.find { authorBean.wm_id == it.wm_id }
?: AuthorBean(wm_id = authorBean.wm_id,image = authorBean.image)
val needUpdateSubscribeStatus =
authorSubscriber.needUpdateSubscribeStatus(target)
if (needUpdateSubscribeStatus) {
authorSubscriber.updateSubscribeStatus(target)
}
}
}
private val subscribeAuthorListCallbackImpl = object : ISubscribeAuthorListCallback {
override fun subscribeAuthorFlowCallback(t: HttpResult<ArrayList<PolymerCommonCardBean>?>?) {
currentStatus =if (t?.code == 0) STATUS_SUCCESS else STATUS_FAILED
val dataList = t?.result
dataList?.size?.let { size ->
val gson = Gson()
authorBeanList.clear()
repeat(size) {
val content = dataList[it].card_list?.get(0)?.content as Map<*, *>? ?: return@repeat
val jsonString = gson.toJson(content)
val authorBean = gson.fromJson<AuthorBean>(jsonString, AuthorBean::class.java)
authorBeanList.add(authorBean)
}
}
updateSubscribeStatus()
}
}
private fun getAuthorSubscribedListFromNet() {
val requestParams = SubscribeAuthorFlowBean.Request("10", 1, 1000)
ApiService.getSubscribeAuthorList(subscribeAuthorListCallbackImpl, requestParams)
}
fun findAuthor(authorId: String): AuthorBean? {
if (authorBeanList.isNotEmpty()) return authorBeanList.find { it.wm_id == authorId}
when(currentStatus){
STATUS_DEFAULT , STATUS_FAILED ->{
currentStatus = STATUS_LOADING
getAuthorSubscribedListFromNet()
}
}
return null
}
fun findAuthor(bean: AuthorBean?): AuthorBean? {
if (authorBeanList.isNotEmpty()) return authorBeanList.find {
it.wm_id == bean?.wm_id
}
when(currentStatus){
STATUS_DEFAULT , STATUS_FAILED ->{
currentStatus = STATUS_LOADING
getAuthorSubscribedListFromNet()
}
}
return null
}
fun subscribeAuthor(bean: AuthorBean) {
//发起订阅 同一多次订阅处理
ApiService.addSubscribe(subCallback, AddSubscribeBean.Request(10, bean.wm_id?:""),bean)
}
fun unsubscribeAuthor(bean: AuthorBean) {
//取消订阅 同一多次取消订阅处理
ApiService.deleteSubscribe(subCallback, DeleteSubscribeBean.Request(10, bean.wm_id?:""),bean)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.thumbUp
interface DocThumbUp<T> {
/**
* 点赞
*/
fun thumbUpDoc(docId:String){}
/**
* 取消点赞
*/
fun unThumbUpDoc(docId:String){}
fun updateThumbUpStatus(bean:T)
fun needUpdateThumbUpStatus(bean:T):Boolean
fun getThumbUpBean(): T?
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.thumbUp
import com.yidian.common.cardutils.PolymerCardFactory
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
import com.yidian.shenghuoquan.newscontent.bean.ThumbUpBean
import com.yidian.shenghuoquan.newscontent.http.ApiService
import java.util.*
val thumbUpManager by lazy { ThumbUpManager.instance }
class ThumbUpManager private constructor() {
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { ThumbUpManager() }
}
private val thumbUpBeanList by lazy { LinkedList<ThumbUpBean>() }
private val thumbUpDocList by lazy { LinkedList<DocThumbUp<ThumbUpBean>>() }
fun updateUpManage(dataList: ArrayList<PolymerCommonCardBean>){
for(polymerCommonCardBean in dataList){
if(polymerCommonCardBean.aggregation_card_type_id == PolymerCardFactory.CommonPolymerCard){
val cardList = polymerCommonCardBean.card_list
if(cardList != null){
val upStatusList = ArrayList<ThumbUpBean>()
for(commonCardBean in cardList){
when(commonCardBean.card_type_id){
in 300001..300005 -> {
val content = commonCardBean.content as Map<*, *>
val docId = content["docid"] as String
val isUp = content["is_thumbsup"] as Boolean
val tempUpCount = content["origin_up"] as Number
val upCount = tempUpCount.toInt()
upStatusList.add(ThumbUpBean(docId, isUp, upCount))
}
}
}
if(upStatusList.isNotEmpty()){
updateThumbUpBeanIfChange(upStatusList)
}
}
}
}
}
/**
* 单条数据更新
*/
fun updateThumbUpBeanIfChange(source: ThumbUpBean){
if(thumbUpBeanList.isEmpty()) return
val target = thumbUpBeanList.find { source.docId == it.docId } ?:return
if (target.dataEquals(source)) return
target.copyData(source)
updateThumbUpStatus()
}
/**
* 数据列表更新
*/
fun updateThumbUpBeanIfChange(sourceList: List<ThumbUpBean>){
if(thumbUpBeanList.isEmpty()) return
sourceList.forEach { bean->
val target = thumbUpBeanList.find { bean.docId == it.docId } ?:return@forEach
if (target.dataEquals(bean)) return@forEach
target.copyData(bean)
}
updateThumbUpStatus()
}
/**
* 点赞数据更新
*/
fun updateThumbUpBeanIfChange(docId: String?,isUp: Boolean,count: Int){
if(thumbUpBeanList.isEmpty()) return
if (docId.isNullOrEmpty()) return
val target = thumbUpBeanList.find { docId == it.docId } ?:return
if (target.isUp == isUp && target.count == count) return
target.isUp = isUp
target.count = count
updateThumbUpStatus()
}
private fun updateOrAddThumbUpBean(bean: ThumbUpBean) {
if (thumbUpBeanList.isEmpty()) {
thumbUpBeanList.add(bean)
updateThumbUpStatus()
return
}
val find = thumbUpBeanList.find { bean.docId == it.docId }
if (find == null) {
thumbUpBeanList.add(bean)
updateThumbUpStatus()
return
}
find.copyData(bean)
updateThumbUpStatus()
}
fun addThumbUpDoc(thumbUpDoc: DocThumbUp<ThumbUpBean>) {
if (thumbUpDocList.contains(thumbUpDoc)) return
thumbUpDocList.add(thumbUpDoc)
updateThumbUpStatus(thumbUpDoc)
}
fun removeThumbUpDoc(thumbUpDoc: DocThumbUp<ThumbUpBean>) {
thumbUpDocList.remove(thumbUpDoc)
}
private fun updateThumbUpStatus() {
thumbUpDocList.forEach { thumbUpDoc ->
updateThumbUpStatus(thumbUpDoc)
}
}
private fun updateThumbUpStatus(thumbUpDoc: DocThumbUp<ThumbUpBean>) {
val bean = thumbUpDoc.getThumbUpBean() ?: return
val target =thumbUpBeanList.find { bean.docId == it.docId } ?: return
val needUpdateThumbUpStatus = thumbUpDoc.needUpdateThumbUpStatus(target)
if (needUpdateThumbUpStatus) {
thumbUpDoc.updateThumbUpStatus(target)
}
}
fun thumbUpDoc(docId: String, count: Int) {
val requestMap = hashMapOf(Pair("docid", docId))
ApiService.articleLike(requestMap) {
val realCount = if (it) count + 1 else count
updateOrAddThumbUpBean(ThumbUpBean(docId, it, realCount))
}
}
fun cancelThumbUpDoc(docId: String, count: Int) {
val requestMap = hashMapOf(Pair("docid", docId))
ApiService.articleLike(requestMap) {
val realCount = if (it) {
if ((count - 1) < 0) 0 else count - 1
} else count
updateOrAddThumbUpBean(ThumbUpBean(docId, !it, realCount))
}
}
fun findThumbUpBean(temp: ThumbUpBean): ThumbUpBean? {
if (temp.docId.isNullOrEmpty()) return null
return thumbUpBeanList.find { temp.docId == it.docId }
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
import androidx.viewbinding.ViewBinding
import com.yidian.common.base.BaseFragment
abstract class AChannelFragment<VB:ViewBinding> :BaseFragment<VB>() {
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
import android.os.Bundle
import com.yidian.common.XRouterPathConstants.Companion.AUDIO_DETAIL
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.databinding.ActivityAudioDetailBinding
import com.yidian.shenghuoquan.newscontent.utils.audioManager
class AudioDetailActivity :BaseActivity<ActivityAudioDetailBinding>(){
private val audioList:MutableList<String> by lazy {
val list = mutableListOf<String>()
val url1 = "http://m801.music.126.net/20210128192529/c5d3a950d5b14f6afc5b15f1491e0a05/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/7136640173/99bd/5b7a/f5d9/a4a150f41f59153eeb55a7126928ce45.mp3"
val url2 ="http://m801.music.126.net/20210128192553/390f7d5a2ac348b727449db82cb2f44f/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/7119541036/6294/e1d1/dd59/862ba690be88fed2c34fd0886171f6f0.mp3"
val url3 ="http://m801.music.126.net/20210128194736/52de12d5a13e707273745c151ce5d084/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/5258591663/61bf/33cf/e6a5/da47602351f7f71aea8c1e88de587411.mp3"
repeat(30){
when(it%3){
0->list.add(url1)
1->list.add(url2)
2->list.add(url3)
}
}
list
}
override fun createViewBinding(): ActivityAudioDetailBinding {
return ActivityAudioDetailBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return AUDIO_DETAIL
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
audioManager.setAudioList(audioList)
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
import com.yidian.common.base.IBaseView
import com.yidian.common.cardutils.bean.PolymerCommonCardBean
interface ChannelView :IBaseView{
fun showData(dataList:List<PolymerCommonCardBean>)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.ui
import android.os.Bundle
import com.yidian.common.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.databinding.ActivityCommonDetailBinding
class CommonDetailActivity : BaseActivity<ActivityCommonDetailBinding>() {
companion object{
}
override fun createViewBinding(): ActivityCommonDetailBinding {
return ActivityCommonDetailBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return ""
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
setStatusBarTextColor(true)
}
}
\ No newline at end of file
......@@ -42,10 +42,6 @@ class NewsContentActivity : BaseActivity<ActivityNewsContentBinding>() {
val commentFragment = CommentWebFragment.newInstance(paramsMap)
supportFragmentManager.beginTransaction().replace(R.id.fly_webContainer, commentFragment).commit()
}
VideoType -> {
val videoDetailFragment = VideoDetailFragment.newInstance(paramsMap)
supportFragmentManager.beginTransaction().replace(R.id.fly_webContainer, videoDetailFragment).commit()
}
}
}
......
This diff is collapsed.
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