Commit 5b9af99f authored by yinjiacheng's avatar yinjiacheng

del 代码整理

parent 608fb9d5
...@@ -3,33 +3,6 @@ ...@@ -3,33 +3,6 @@
package="com.yidian.shenghuoquan.newscontent"> package="com.yidian.shenghuoquan.newscontent">
<application> <application>
<activity android:name=".ui.DeepLinkActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="link_news"
android:scheme="ydsubway" />
</intent-filter>
</activity>
<activity
android:name=".ui.NewsContentActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" />
<service
android:name=".audio.AudioService"
android:enabled="true"
android:exported="true" />
<activity
android:name=".ui.alive.AliveTestActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.idcard.IDCardTestActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountEnterpriseAuthCompleteActivity" android:name=".ui.auth.LifeAccountEnterpriseAuthCompleteActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
...@@ -39,60 +12,38 @@ ...@@ -39,60 +12,38 @@
<activity <activity
android:name=".ui.auth.LifeAccountCreateCompleteActivity" android:name=".ui.auth.LifeAccountCreateCompleteActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.idcard.IDCardResultActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.ProtocolActivity" android:name=".ui.ProtocolActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.ProductSupportActivity"
android:theme="@style/Transparent" />
<activity android:name=".ui.LoginLifeCircleActivity" /> <activity android:name=".ui.LoginLifeCircleActivity" />
<activity <activity
android:name=".ui.store.StoreManagementActivity" android:name=".ui.store.StoreManagementActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.EditStoreActivity" android:name=".ui.store.EditStoreActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.SelectAddressActivity" android:name=".ui.store.SelectAddressActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.SearchAddActivity" android:name=".ui.store.SearchAddActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountIdentityActivity" android:name=".ui.auth.LifeAccountIdentityActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountAuthActivity" android:name=".ui.auth.LifeAccountAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.LifeAccountEnterpriseCertificationActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountCreateActivity" android:name=".ui.auth.LifeAccountCreateActivity"
android:theme="@style/Transparent" android:theme="@style/Transparent"
android:windowSoftInputMode="stateHidden|adjustResize" /> android:windowSoftInputMode="stateHidden|adjustResize" />
<activity <activity
android:name=".ui.auth.LifeAccountPersonalAuthActivity" android:name=".ui.auth.LifeAccountPersonalAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountEnterpriseAuthActivity" android:name=".ui.auth.LifeAccountEnterpriseAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".personnel.ui.MyStaffActivity" android:name=".personnel.ui.MyStaffActivity"
android:launchMode="singleTask" android:launchMode="singleTask"
...@@ -115,20 +66,16 @@ ...@@ -115,20 +66,16 @@
<activity <activity
android:name=".ui.setting.SystemSettingActivity" android:name=".ui.setting.SystemSettingActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.MerchantCenterActivity" android:name=".ui.center.MerchantCenterActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.MerchantInfoActivity" android:name=".ui.center.MerchantInfoActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.LifeAccountModifyNameActivity" android:name=".ui.center.LifeAccountModifyNameActivity"
android:theme="@style/Transparent" android:theme="@style/Transparent"
android:windowSoftInputMode="stateVisible" /> android:windowSoftInputMode="stateVisible" />
<activity <activity
android:name=".ui.center.MerchantAuthInfoActivity" android:name=".ui.center.MerchantAuthInfoActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
...@@ -146,7 +93,6 @@ ...@@ -146,7 +93,6 @@
android:name=".ui.center.MerchantAuthManagementActivity" android:name=".ui.center.MerchantAuthManagementActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" /> android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" />
<activity android:name=".ui.setting.FeedbackActivity" /> <activity android:name=".ui.setting.FeedbackActivity" />
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import kotlinx.android.extensions.LayoutContainer
class FeedbackDetailAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
private lateinit var mOnItemClickListener: OnItemClickListener<String>
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_feedback_detail))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
val tvContent = holder.itemView.findViewById<TextView>(R.id.tv_content)
holder.setData(dataList[position], tvContent)
holder.itemView.setOnClickListener {
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
fun update(newData: ArrayList<String>) {
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
override fun getItemCount(): Int {
return dataList.size
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<String>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(content: String, tvContent: TextView) {
tvContent.text = content
}
}
}
package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.SharePlatformBean
import kotlinx.android.extensions.LayoutContainer
class ShareAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object{
const val normalType = 0
const val headType = -1
const val footType = -2
}
private val dataList: ArrayList<SharePlatformBean> by lazy { ArrayList<SharePlatformBean>() }
private lateinit var mOnItemClickListener: OnItemClickListener<SharePlatformBean>
override fun getItemViewType(position: Int): Int {
return dataList[position].viewType
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when(viewType){
headType -> ViewHolder(createItemView(parent, R.layout.item_share_card))
footType -> ViewHolder(createItemView(parent, R.layout.item_share_link))
else -> ViewHolder(createItemView(parent, R.layout.item_share_platform))
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position], holder)
holder.itemView.setOnClickListener{
mOnItemClickListener.onClick(it, position, dataList[position])
}
}
fun update(newData: ArrayList<SharePlatformBean>){
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
override fun getItemCount(): Int {
return dataList.size
}
fun setOnItemClickListener(onItemClickListener: OnItemClickListener<SharePlatformBean>) {
mOnItemClickListener = onItemClickListener
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(sharePlatformBean: SharePlatformBean, holder: ViewHolder) {
holder.itemView.findViewById<ImageView>(R.id.iv_platform).setBackgroundResource(sharePlatformBean.imageId)
holder.itemView.findViewById<TextView>(R.id.tv_platform).text = sharePlatformBean.name
}
}
}
...@@ -8,7 +8,7 @@ import androidx.recyclerview.widget.RecyclerView ...@@ -8,7 +8,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.yidian.shenghuoquan.newscontent.R import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.http.httpbean.GetShopListBean import com.yidian.shenghuoquan.newscontent.http.httpbean.GetShopListBean
import com.yidian.shenghuoquan.newscontent.ui.store.EditStoreActivity import com.yidian.shenghuoquan.newscontent.ui.store.EditStoreActivity
import com.yidian.shenghuoquan.newscontent.viewholder.StoreViewHolder import com.yidian.shenghuoquan.newscontent.ui.store.viewholder.StoreViewHolder
/** /**
* 门店管理列表的adapter * 门店管理列表的adapter
......
package com.yidian.shenghuoquan.newscontent.adapter
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.yidian.bcommon.utils.ViewHolderUtil.Companion.createItemView
import com.yidian.shenghuoquan.newscontent.R
import kotlinx.android.extensions.LayoutContainer
class UpdateVersionDesAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
private val dataList: ArrayList<String> by lazy { ArrayList<String>() }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return ViewHolder(createItemView(parent, R.layout.item_update_version_des))
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
holder as ViewHolder
holder.setData(dataList[position], holder)
}
override fun getItemCount(): Int {
return dataList.size
}
fun update(newData: ArrayList<String>) {
newData.let {
dataList.clear()
dataList.addAll(it)
notifyDataSetChanged()
}
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), LayoutContainer {
override val containerView: View
get() = itemView
fun setData(des: String, holder: ViewHolder) {
holder.itemView.findViewById<TextView>(R.id.tv_versionDes).text = des
}
}
}
package com.yidian.shenghuoquan.newscontent.adapter
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentPagerAdapter
class ViewPagerAdapter(fragmentManager: FragmentManager,
private val fragments: List<Fragment>) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItem(index: Int): Fragment = fragments[index]
override fun getCount(): Int = fragments.size
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.audio
import android.media.MediaPlayer
import java.lang.ref.WeakReference
class AudioPlayerManager private constructor(): IAudioControl {
companion object {
val instance: AudioPlayerManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { AudioPlayerManager() }
const val STATUS_START = 0
const val STATUS_PAUSE = 1
const val STATUS_STOP = 2
}
private var isAutoPlay = false
private var singleLoop = false
private var onPrepare: (() -> Unit)? = null
private var prepareResult: ((Boolean, Long) -> Unit)? = null
private var onError: (() -> Unit)? = null
private var bufferUpdate: ((Int) -> Unit)? = null
private var onComplete: (() -> Unit)? = null
private var audioPlayer: MediaPlayer? = null
private var audioView:WeakReference<IAudioView>?=null
private val audioList = mutableListOf<String>()
private var currentIndex = 0
private var duration:Int = 0
private var currentStatus = STATUS_STOP
private val prepareListener = MediaPlayer.OnPreparedListener {
onPrepare?.invoke()
prepareResult?.invoke(true, it.duration.toLong())
}
private val errorListener = MediaPlayer.OnErrorListener { mr, what, extra ->
onError?.invoke()
return@OnErrorListener true
}
private val bufferListener = MediaPlayer.OnBufferingUpdateListener {mp,percent->
bufferUpdate?.invoke(percent)
}
private val completeListener = MediaPlayer.OnCompletionListener {
if (onComplete!=null){
onComplete?.invoke()
}else{
if (isAutoPlay){
next()
}
}
}
fun setAudioList(list:MutableList<String>,index:Int = 0){
currentIndex = index
audioList.clear()
audioList.addAll(list)
}
fun prepareAsync (url: String?=null, result: ((Boolean, Long) -> Unit)?=null) {
val realUrl = if (url.isNullOrEmpty()) {
if (currentIndex>=audioList.size) null else audioList[currentIndex]
} else url
if (realUrl.isNullOrEmpty()) {
result?.invoke(false,0)
return
}
prepareResult = result
if (audioPlayer == null) {
audioPlayer = MediaPlayer()
}
audioPlayer?.apply {
setDataSource(realUrl)
setOnPreparedListener(prepareListener)
setOnErrorListener(errorListener)
setOnBufferingUpdateListener(bufferListener)
setOnCompletionListener(completeListener)
prepareAsync()
}
}
override fun bindAudioView(view: IAudioView) {
audioView = WeakReference(view)
view.bindAudioControl(this)
}
override fun start(progress: Int,user:Boolean) {
if (audioPlayer==null || audioPlayer?.duration?:0==0) return
if (user) isAutoPlay = true
if (progress<0){
audioPlayer?.start()
return
}
val duration = (audioPlayer!!.duration *progress.toFloat()/100 +0.5f).toInt()
audioPlayer?.seekTo(duration)
audioPlayer?.start()
}
override fun pause() {
audioPlayer?.pause()
}
override fun stop() {
audioPlayer?.stop()
}
override fun seekTo(progress: Int) {
val total = audioPlayer?.duration?:0
if (total == 0) return
audioPlayer?.seekTo((total * progress.toFloat()/total).toInt())
}
override fun isPlaying() :Boolean {
return audioPlayer!=null && audioPlayer!!.isPlaying
}
override fun next() {
if (audioPlayer?.isPlaying==true){
audioPlayer?.stop()
}
audioPlayer?.reset()
currentIndex++
if (currentIndex>=audioList.size){
currentIndex--
checkPrevAndNext(currentIndex)
return
}
checkPrevAndNext(currentIndex)
audioView?.get()?.setContent("第${currentIndex+1}首")
prepareAsync{ result,_->
if (result){
audioView?.get()?.setPlayEnable(true)
if (isAutoPlay) start(0,false)
}
}
}
override fun previous() {
if (audioPlayer?.isPlaying==true){
audioPlayer?.stop()
}
audioPlayer?.reset()
currentIndex--
if (currentIndex<0){
currentIndex=0
checkPrevAndNext(currentIndex)
return
}
checkPrevAndNext(currentIndex)
audioView?.get()?.setContent("第${currentIndex+1}首")
if (currentIndex == 0){
audioView?.get()?.setPrevEnable(false)
}
prepareAsync{ result,_->
if (result){
audioView?.get()?.setPlayEnable(true)
if (isAutoPlay) start(0,false)
}
}
}
private fun checkPrevAndNext(index: Int){
if (index == 0){
audioView?.get()?.setPrevEnable(false)
}
if (index>=audioList.size){
audioView?.get()?.setNextEnable(false)
}
if (index>0 && index<audioList.size-1){
audioView?.get()?.setPrevEnable(true)
audioView?.get()?.setNextEnable(true)
}
}
override fun release() {
audioView?.clear()
audioView=null
onPrepare=null
onError=null
bufferUpdate=null
audioPlayer?.reset()
audioPlayer?.release()
audioPlayer = null
}
fun setOnPrepareListener(onPrepare: () -> Unit) {
this.onPrepare = onPrepare
}
fun setOnErrorListener(onError: () -> Unit) {
this.onError = onError
}
fun setOnBufferListener(bufferUpdate: (Int) -> Unit) {
this.bufferUpdate = bufferUpdate
}
fun setOnCompleteListener(onComplete: () -> Unit) {
this.onComplete = onComplete
}
/**
* 在视频页面必须停止播放音频,释放资源。在这里需要记录当前的播放状态,播放进度
*/
fun pauseForVideo() {
}
/**
* 因视频暂停音频播放后的恢复操作
*/
fun restartAudio(){
}
class AudioPauseStatus{
var playStatus:Int = STATUS_STOP
var duration = 0
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.audio
import android.app.Service
import android.content.Intent
import android.graphics.PixelFormat
import android.os.Build
import android.os.IBinder
import android.util.Log
import android.view.*
import android.view.WindowManager.LayoutParams.*
import androidx.core.view.isGone
import com.yidian.shenghuoquan.newscontent.utils.audioManager
import com.yidian.shenghuoquan.newscontent.widget.FloatAudioView
/**
* 主要控制音频的生命周期
*/
class AudioService : Service() {
private val TAG = "AudioService"
private var windowManager:WindowManager?=null
private lateinit var rootView: FloatAudioView
override fun onCreate() {
super.onCreate()
windowManager = getSystemService(WINDOW_SERVICE) as WindowManager?
rootView = FloatAudioView(this)
rootView.setPlayEnable(false)
audioManager.prepareAsync { result,_->
Log.e(TAG, "onCreate: prepare$result" )
if (result){
rootView.setContent("第一首歌")
rootView.setPlayEnable(true)
}
}
audioManager.setOnErrorListener {
Log.e(TAG, "onError: =========" )
}
rootView.setOnCloseListener {
stopSelf()
}
}
override fun onBind(intent: Intent): IBinder? {
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
showFloatingWindow()
return START_STICKY
}
private fun showFloatingWindow(){
val params = WindowManager.LayoutParams()
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
params.type = TYPE_APPLICATION_OVERLAY
}else{
params.type = TYPE_PHONE
}
params.packageName = packageName
params.flags = params.flags or FLAG_HARDWARE_ACCELERATED
params.flags = params.flags or FLAG_NOT_FOCUSABLE or FLAG_NOT_TOUCH_MODAL
params.flags = params.flags or FLAG_LAYOUT_INSET_DECOR or FLAG_LAYOUT_IN_SCREEN
params.width = MATCH_PARENT
params.height = WRAP_CONTENT
params.format = PixelFormat.TRANSPARENT
params.gravity = Gravity.BOTTOM
params.x = 0
params.y = 500
windowManager?.addView(rootView,params)
audioManager.bindAudioView(rootView)
}
override fun onDestroy() {
super.onDestroy()
rootView.isGone = true
windowManager?.removeView(rootView)
windowManager =null
audioManager.release()
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.audio
interface IAudioControl {
fun start(progress: Int = -1,user:Boolean=true)
fun next()
fun previous()
fun pause()
fun stop()
fun isPlaying():Boolean
fun release()
fun seekTo(progress: Int)
fun bindAudioView(view: IAudioView)
}
interface IAudioView{
fun setPrevEnable(enable:Boolean)
fun setNextEnable(enable:Boolean)
fun setPlayEnable(enable:Boolean)
fun setContent(content:String)
fun updatePlayUi(isPlay:Boolean)
fun bindAudioControl(control: IAudioControl)
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.service
import com.yidian.bcommon.XEventConfig.Companion.GO_TO_COMMENT_DETAIL
import com.yidian.bcommon.XEventConfig.Companion.REPLY_COMMENT
import com.yidian.bcommon.XEventConfig.Companion.REPLY_DETAIL_COMMENT
import com.yidian.bcommon.XEventConfig.Companion.UPDATE_COMMENT
import com.yidian.bcommon.XEventConfig.Companion.UPDATE_LIKE
import com.yidian.bcommon.utils.ToolsUtil
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.yac.core.zap.ZapService
import org.json.JSONObject
class CommentService : ZapService() {
companion object {
const val serviceName: String = "CommentService"
}
private lateinit var resolver: ResultResolver
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
when (action) {
REPLY_COMMENT -> {
ToolsUtil.doAction(REPLY_COMMENT, params)
}
GO_TO_COMMENT_DETAIL -> {
ToolsUtil.doAction(GO_TO_COMMENT_DETAIL, params)
}
REPLY_DETAIL_COMMENT -> {
ToolsUtil.doAction(REPLY_DETAIL_COMMENT, params)
}
UPDATE_COMMENT -> {
ToolsUtil.doAction(UPDATE_COMMENT, params)
}
UPDATE_LIKE -> {
ToolsUtil.doAction(UPDATE_LIKE, params)
}
}
this.resolver = resolver
params as JSONObject
val path = params.optString("name")
val body = params.optJSONObject("body")
when (action) {
"addComment" -> addComment(path, body)
"like" -> like(path, body)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun addComment(path: String, params: JSONObject) {
}
private fun like(path: String, params: JSONObject) {
}
}
package com.yidian.shenghuoquan.newscontent.service
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.shenghuoquan.newscontent.ui.NewsContentActivity
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.xpage.XPageManager
import com.yidian.yac.core.zap.ZapService
import org.json.JSONObject
class DeepLinkService : ZapService() {
companion object {
const val serviceName: String = "DeepLinkService"
}
private lateinit var resolver: ResultResolver
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
params as JSONObject
val parameters = params.optJSONObject("parameters")
when (params.optString("path")) {
"ydnews" -> jumpNewsText(parameters)
"ydvideo" -> jumpNewsVideo(parameters)
"ydauthor" -> jumpAuthorHomePage(parameters)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun jumpNewsText(params: JSONObject) {
val docId = params.optString("docid")
val paramsMap = HashMap<String, Any?>()
paramsMap[NewsContentActivity.ContentType] = NewsContentActivity.TextType
paramsMap[NewsContentActivity.DocId] = docId
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, paramsMap)
}
private fun jumpNewsVideo(params: JSONObject) {
val docId = params.optString("docid")
val paramsMap = HashMap<String, Any?>()
paramsMap[NewsContentActivity.ContentType] = NewsContentActivity.VideoType
paramsMap[NewsContentActivity.DocId] = docId
XPageManager.push(XRouterPathConstants.NEWS_CONTENT, paramsMap)
}
private fun jumpAuthorHomePage(params: JSONObject) {
val fromId = params.optString("fromid")
val paramsMap = HashMap<String, Any?>()
}
}
package com.yidian.shenghuoquan.newscontent.service
import android.graphics.Bitmap
import com.google.gson.Gson
import com.yidian.bcommon.YdBaseApplication
import com.yidian.bcommon.http.HttpResult
import com.yidian.shenghuoquan.newscontent.http.ApiService
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
import id.zelory.compressor.Compressor
import id.zelory.compressor.constraint.format
import id.zelory.compressor.constraint.quality
import id.zelory.compressor.constraint.resolution
import id.zelory.compressor.constraint.size
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import org.json.JSONObject
import java.io.File
class RequestService : ZapService() {
companion object {
const val serviceName: String = "RequestService"
}
private lateinit var resolver: ResultResolver
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
params as JSONObject
val path = params.optString("path")
var body = params.optJSONObject("body")
if (body == null) {
body = JSONObject()
}
when (action) {
"request" -> requestApi(path, body)
"download" -> download(path, body)
"uploadImage" -> uploadFile(body)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun download(path: String, params: JSONObject) {
}
private val userInfoImpl = object : IUserInfoCallback {
override fun userInfoCallback(t: HttpResult<Any?>?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
override fun modifyNicknameCallback(t: HttpResult<Any?>?) {
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)
// }
// }
}
private val uploadFileCallback = object : IUploadFileCallback {
override fun uploadFileCallBack(t: HttpResult<Any?>?) {
val params = Gson().toJson(t)
resolver.success(JSONObject(params))
}
}
private fun uploadFile(params: JSONObject) {
if (YdBaseApplication.activityList.size <= 0) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
val filePath = params.optString("profile")
val file = File(filePath)
CoroutineScope(Dispatchers.IO).launch {
val compressedImageFile = Compressor.compress(activity, file) {
resolution(360, 360)
quality(80)
format(Bitmap.CompressFormat.PNG)
size(307200)
}
val requestBody = UploadFileUtils.fileToMultipartBodyPart("profile", compressedImageFile)
ApiService.uploadFile(uploadFileCallback, requestBody)
}
}
}
package com.yidian.shenghuoquan.newscontent.service
import android.util.Log
import android.widget.Toast
import androidx.core.app.NotificationManagerCompat
import com.google.gson.Gson
import com.orhanobut.hawk.Hawk
import com.yidian.bcommon.AppConfig
import com.yidian.bcommon.HawkConfig
import com.yidian.bcommon.XEventConfig
import com.yidian.bcommon.YdBaseApplication
import com.yidian.bcommon.services.XEventService
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.IUpdateDialogCallback
import com.yidian.shenghuoquan.newscontent.bean.ImageItemBean
import com.yidian.shenghuoquan.newscontent.bean.xbrid.ClientInfoBean
import com.yidian.shenghuoquan.newscontent.bean.xevent.XEventOpenGalleryBean
import com.yidian.shenghuoquan.newscontent.ui.dialog.UpdateVersionDialog
import com.yidian.shenghuoquan.newscontent.utils.DataCleanManager
import com.yidian.utils.ToastUtil
import com.yidian.xarc.xbase.net.CheckUpdateCallback
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.yac.core.zap.ZapService
import com.yidian.yac.pm.appupdate.AppUpdateEchoData
import com.yidian.yac.pm.appupdate.AppUpdateInfo
import com.yidian.yac.pm.appupdate.YDAppUpdateManager
import com.yidian.yac.pm.appupdate.callback.AppUpdateCallback
import com.yidian.yac.pm.base.UpdateInfo
import org.json.JSONObject
import java.io.File
class UniversalService: ZapService(){
companion object{
const val serviceName: String = "UniversalService"
}
private lateinit var resolver: ResultResolver
private lateinit var updateInfoTemp: AppUpdateInfo<AppUpdateEchoData>
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
params as JSONObject
when(action){
"makeToast" -> showToast(params)
"openGallery" -> openGallery(params)
"getClientInfo" -> getClientInfo()
"getAllCache" -> getAllCache()
"clearAllCache" -> clearAllCache()
"notificationStatus" -> getNotificationStatus()
"notificationOnSetting" -> notificationOnSetting()
"checkNewVersion" -> checkUpdate()
"popNewVersion" -> popNewVersion(updateInfoTemp)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun showToast(params: JSONObject){
val message = params.optString("message", "")
Toast.makeText(YdBaseApplication.context, message, Toast.LENGTH_SHORT).show()
}
private fun openGallery(params: JSONObject){
val index = params.optInt("index")
val imageArray = params.optJSONArray("imageList")
val url = params.optString("url")
val imageList = ArrayList<ImageItemBean>()
repeat(imageArray.length()){
imageList.add(ImageItemBean(imageArray.get(it).toString()))
}
val xbaseEvent = XBaseEvent(XEventConfig.OPEN_GALLERY, XEventOpenGalleryBean(index, imageList, url))
XEventService.postEvent(xbaseEvent)
}
private fun getClientInfo(){
val userId = Hawk.get(HawkConfig.Username, "")
val nickname = Hawk.get(HawkConfig.Nickname, "")
val portrait = Hawk.get(HawkConfig.ProfileUrl, "")
val loginStatus = Hawk.get(HawkConfig.LoginStatus, false)
val userInfo = ClientInfoBean.UserInfo(userId, nickname, portrait, loginStatus)
val appInfo = ClientInfoBean.AppInfo(AppConfig.cv)
val clientInfoBean = ClientInfoBean(userInfo, appInfo)
val params = Gson().toJson(clientInfoBean)
resolver.success(JSONObject(params))
}
private fun getAllCache(){
val cacheSize = DataCleanManager.getTotalCacheSizeShow(YdBaseApplication.context)
resolver.success(cacheSize)
}
private fun clearAllCache(){
Thread {
DataCleanManager.clearAllCache(YdBaseApplication.context)
}.start()
resolver.success("0K")
}
private fun getNotificationStatus(){
if (YdBaseApplication.activityList.size <= 0) return
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size-1]
val manage = NotificationManagerCompat.from(activity)
val isOpen = manage.areNotificationsEnabled()
resolver.success(isOpen)
}
private fun notificationOnSetting(){
val xbaseEvent = XBaseEvent(XEventConfig.OPEN_PUSH, "")
XEventService.postEvent(xbaseEvent)
}
private fun checkUpdate(){
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
YDAppUpdateManager.checkAppUpdate(object: CheckUpdateCallback() {
override fun onSucess(updateInfo: UpdateInfo<Any>?) {
updateInfoTemp = updateInfo as AppUpdateInfo<AppUpdateEchoData>
val jsonString = Gson().toJson(updateInfoTemp)
val jsonObject = JSONObject(jsonString)
jsonObject.put("localVersion", AppConfig.cv)
activity.runOnUiThread{
resolver.success(jsonObject)
}
}
override fun onFail(msg: String) {
activity.runOnUiThread {
ToastUtil.showToast(activity, msg)
}
}
})
}
private val updateDialogCallback = object: IUpdateDialogCallback {
override fun downloadCallback(updateInfo: AppUpdateInfo<AppUpdateEchoData>) {
updateDownload(updateInfo)
}
}
private fun popNewVersion(updateInfo: AppUpdateInfo<AppUpdateEchoData>){
val activity = YdBaseApplication.activityList[YdBaseApplication.activityList.size - 1]
activity.runOnUiThread {
val updateDialog = UpdateVersionDialog(activity, R.style.update_dialog, updateDialogCallback)
updateDialog.setData(updateInfo)
updateDialog.show()
}
}
private fun updateDownload(updateInfo: AppUpdateInfo<AppUpdateEchoData>){
YDAppUpdateManager.download(updateInfo, object : AppUpdateCallback() {
override fun onProgress(total: Long, current: Long, percentage: Int) {
Log.e("zhb-yd", "进度:========$percentage")
}
override fun onDownloadSuccess(apkFile: File, isCache: Boolean) {
YDAppUpdateManager.installApk(apkFile)
}
override fun onDownloadFailed() {
}
override fun onDownloadPaused() {
}
override fun onInstallFailed() {
}
override fun onSignatureVerifiyFailed() {
}
}, false)
}
}
package com.yidian.shenghuoquan.newscontent.service
import com.yidian.xarc.xrouter.ResultResolver
import com.yidian.yac.core.zap.ZapService
import org.json.JSONObject
class UserService : ZapService() {
companion object {
const val serviceName: String = "UserService"
}
private lateinit var resolver: ResultResolver
override fun onAction(name: String, action: String, params: Any, options: Any, resolver: ResultResolver) {
this.resolver = resolver
params as JSONObject
val path = params.optString("path")
val body = params.optJSONObject("body")
when (action) {
"addComment" -> addComment(path, body)
"like" -> like(path, body)
}
}
override fun onExit() {
}
override fun onInit() {
}
private fun addComment(path: String, params: JSONObject) {
}
private fun like(path: String, params: JSONObject) {
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.annotation.SuppressLint
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import android.webkit.WebChromeClient
import android.webkit.WebView
import androidx.core.os.bundleOf
import com.google.gson.Gson
import com.yidian.bcommon.XEventConfig
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.bcommon.base.BaseFragment
import com.yidian.bcommon.http.HttpResult
import com.yidian.shenghuoquan.newscontent.bean.ContentDetailBean
import com.yidian.shenghuoquan.newscontent.databinding.FragmentWebBinding
import com.yidian.xarc.xbrid.XBridManager
import com.yidian.xarc.xbrid.XWebView
import com.yidian.xarc.xevent.XBaseEvent
import com.yidian.xarc.xevent.XEventManager
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.json.JSONObject
class CommentWebFragment : BaseFragment<FragmentWebBinding>() {
companion object {
fun newInstance(paramsMap: Map<*, *>): CommentWebFragment {
return CommentWebFragment().apply {
arguments = bundleOf(Pair(XRouterPathConstants.ParamsKey, paramsMap))
}
}
}
private lateinit var webView: XWebView
private var loadDataFinish = false
private var loadWebViewFinish = false
private var data: HttpResult<Any?>? = null
private var isDestroy = false
override fun createViewBinding(
inflater: LayoutInflater,
container: ViewGroup?
): FragmentWebBinding {
return FragmentWebBinding.inflate(inflater, container, false)
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
val paramsMap = arguments?.getSerializable(XRouterPathConstants.ParamsKey) as Map<*, *>
initData()
initWebView()
setClickListener()
}
private fun initData() {
}
@SuppressLint("SetJavaScriptEnabled")
private fun initWebView() {
webView = XBridManager.getWebView(requireContext(), "testidenfier", viewBinding.commentWeb)
webView.loadUrl("xbrid_article")
webView.webChromeClient = object : WebChromeClient() {
override fun onProgressChanged(view: WebView?, newProgress: Int) {
super.onProgressChanged(view, newProgress)
if (newProgress == 100) {
loadWebViewFinish = true
postDataToWeb()
}
}
}
WebView.setWebContentsDebuggingEnabled(true)
}
private fun postDataToWeb() {
if (loadDataFinish && loadWebViewFinish) {
val contentDetailBean = ContentDetailBean("getArticleData", data)
val params = Gson().toJson(contentDetailBean)
XBridManager.postEvent("ArticleService", JSONObject(params), webView)
}
}
private fun setClickListener() {
}
override fun onDestroy() {
super.onDestroy()
isDestroy = true
if (::webView.isInitialized) {
XBridManager.backWebView(webView)
}
XEventManager.unRegister(this)
}
@Subscribe(sticky = false, threadMode = ThreadMode.MAIN)
fun onEvent(event: XBaseEvent?) {
when (event?.name) {
XEventConfig.SCROLL_SETTING_BAR -> {
val isShow = event.body as Boolean
}
}
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.Window
import androidx.appcompat.app.AppCompatActivity
import com.yidian.bcommon.XRouterPathConstants.Companion.FLASH
import com.yidian.xpage.XPageManager
class DeepLinkActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
setContentView(View(this))
getDataFromBrowser()
}
private fun getDataFromBrowser() {
val uri = intent.data
Log.e("zhb-yd", "deepUri:$uri")
val scheme = uri?.scheme
val host = uri?.host
val deepData = uri?.getQueryParameter("deep_data")
Log.e("zhb-yd", "scheme:$scheme====host:$host====deepJson:$deepData")
val paramsMap = HashMap<String, Any?>()
paramsMap["jumpFrom"] = "DeepLink"
paramsMap["deepData"] = deepData
XPageManager.push(FLASH, paramsMap)
finish()
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.app.Activity
import android.content.ContentResolver
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.FileUtils
import android.provider.MediaStore
import android.util.Log
import androidx.core.content.FileProvider
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.bcommon.base.BaseActivity
import com.yidian.bcommon.constant.GlobalConstants
import com.yidian.bcommon.utils.YdFileUtils
import com.yidian.shenghuoquan.newscontent.databinding.ActivityLifeAccountEnterpriseCertificationBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.httpbean.BusinessLicenseOCRBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.IBusinessLicenseOCRCallback
import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import com.yidian.utils.ToastUtil
import java.io.File
import java.io.FileOutputStream
/**
* author: yinjiacheng
* date: 5/24/21 3:15 PM
* description: 企业生活号认证
*/
class LifeAccountEnterpriseCertificationActivity :
BaseActivity<ActivityLifeAccountEnterpriseCertificationBinding>() {
companion object {
private const val TAG = "BusinessLicenseOCR"
private const val REQUEST_CODE_PERMISSIONS = 1000 //权限
private const val REQUEST_CODE_ALBUM = 1001 //相册
private const val REQUEST_CODE_CAMERA = 1002 //相机
private const val FILE_PATH_BUSINESS_LICENSE_CAMERA = "/ocr/business_license_camera.jpg"
private const val FILE_PATH_BUSINESS_LICENSE = "/ocr/business_license.jpg"
}
/**
* 调用系统相机拍照,照片Uri
*/
private lateinit var photoUri: Uri
/**
* 营业执照文件路径
*/
private var filePath: String? = null
override fun createViewBinding(): ActivityLifeAccountEnterpriseCertificationBinding {
return ActivityLifeAccountEnterpriseCertificationBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return XRouterPathConstants.LIFE_ACCOUNT_ENTERPRISE_CERTIFICATION
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
initListener()
}
private fun initListener() {
viewBind.btnOpenAlbum.setOnClickListener {
// 打开系统相册
val intent = Intent()
intent.action = Intent.ACTION_PICK
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*")
startActivityForResult(intent, REQUEST_CODE_ALBUM)
}
viewBind.btnTakePhoto.setOnClickListener {
val file = File(externalCacheDir?.absolutePath + FILE_PATH_BUSINESS_LICENSE_CAMERA)
if (file.exists()) {
file.delete()
} else {
file.parentFile?.mkdirs()
file.createNewFile()
}
photoUri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
FileProvider.getUriForFile(this, GlobalConstants.AUTHORITY, file)
} else {
Uri.fromFile(file)
}
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
//android11以后强制分区存储,外部资源无法访问,所以添加一个输出保存位置,然后取值操作
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
startActivityForResult(intent, REQUEST_CODE_CAMERA)
}
viewBind.btnOcr.setOnClickListener {
KS3Core.INSTANCE.uploadObject(
generateUploadFile(filePath),
KS3Core.ObjectType.IMAGE,
KS3Core.ScenarioType.BUSINESS_LICENSE,
object : KS3Core.OnKS3TaskListener {
override fun onTaskStart() {
}
override fun onTaskProgress(progress: Double) {
}
override fun onTaskFinish() {
}
override fun onTaskCancel() {
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
if (bucket == null || objectKey == null) return
val requestParams = HashMap<String, String?>()
requestParams["business_image_objectid"] = objectKey
requestParams["business_image_bucket"] = bucket
ApiService.businessLicenseOCR(object : IBusinessLicenseOCRCallback {
override fun businessLicenseOCRSuccess(result: BusinessLicenseOCRBean.Response?) {
Log.d(TAG, "name: ${result?.name}, code: ${result?.code}")
ToastUtil.showToast(this@LifeAccountEnterpriseCertificationActivity, "ocr result, name: ${result?.name}, code: ${result?.code}")
}
override fun businessLicenseOCRFailure(message: String?) {
}
}, requestParams)
}
override fun onTaskFailure(statesCode: Int, message: String?) {
}
})
}
}
/**
* 通过Uri获取文件全路径
* 适配Android Q
*/
private fun getFilePathFromUri(uri: Uri?): String? {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val file = File(externalCacheDir?.absolutePath + FILE_PATH_BUSINESS_LICENSE)
if (file.exists()) {
file.delete()
} else {
file.parentFile?.mkdirs()
file.createNewFile()
}
if (uri?.scheme == ContentResolver.SCHEME_CONTENT) {
val inputStream = contentResolver.openInputStream(uri)
val fileOutputStream = FileOutputStream(file)
inputStream?.let { FileUtils.copy(it, fileOutputStream) }
inputStream?.close()
fileOutputStream.close()
return file.absolutePath
}
return null
} else {
return YdFileUtils.getImageAbsolutePath(this, uri)
}
}
/**
* 生成金山云上传文件
*/
private fun generateUploadFile(filePath: String?): File {
BitmapFactory.decodeFile(filePath)
.compress(Bitmap.CompressFormat.JPEG, 10, FileOutputStream(filePath))
return File(filePath)
}
/**
* 根据容器大小生成Bitmap
*
* @param filePath 本地文件路径
*/
private fun generateBitmap(filePath: String?): Bitmap? {
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(filePath, options)
options.inSampleSize =
calculateInSampleSize(options, viewBind.ivImage.width, viewBind.ivImage.height)
options.inJustDecodeBounds = false
return BitmapFactory.decodeFile(filePath, options)
}
/**
* 计算Bitmap inSampleSize
*
* @param targetWidth 容器宽
* @param targetHeight 容器高
*/
private fun calculateInSampleSize(
options: BitmapFactory.Options,
targetWidth: Int,
targetHeight: Int
): Int {
val sourceWidth = options.outWidth
val sourceHeight = options.outHeight
var inSampleSize = 1
if (sourceWidth > targetWidth || sourceHeight > targetHeight) {
val halfWidth = sourceWidth / 2
val halfHeight = sourceHeight / 2
// 压缩后的尺寸与所需的尺寸进行比较
while (halfWidth / inSampleSize >= targetWidth && halfHeight / inSampleSize >= targetHeight) {
inSampleSize *= 2
}
}
return inSampleSize
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == Activity.RESULT_OK) {
when (requestCode) {
REQUEST_CODE_ALBUM -> {
filePath = getFilePathFromUri(data?.data)
viewBind.ivImage.setImageBitmap(generateBitmap(filePath))
}
REQUEST_CODE_CAMERA -> {
filePath = getFilePathFromUri(photoUri)
viewBind.ivImage.setImageBitmap(generateBitmap(filePath))
}
}
}
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.content.Intent
import android.os.Bundle
import com.umeng.socialize.UMShareAPI
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.bcommon.XRouterPathConstants.Companion.NEWS_CONTENT
import com.yidian.bcommon.base.BaseActivity
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityNewsContentBinding
class NewsContentActivity : BaseActivity<ActivityNewsContentBinding>() {
override fun createViewBinding(): ActivityNewsContentBinding {
return ActivityNewsContentBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return NEWS_CONTENT
}
companion object {
const val ContentType = "content_type"
const val TextType = "text_detail"
const val VideoType = "video_detail"
const val DocId = "doc_id"
const val JumpFrom = "jump_from"
}
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
if(intent.getSerializableExtra(XRouterPathConstants.ParamsKey) !=null){
val paramsMap = intent.getSerializableExtra(XRouterPathConstants.ParamsKey) as HashMap<*, *>
val newContentType = paramsMap[ContentType] as String
initFragment(newContentType,paramsMap)
}
}
private fun initFragment(contentType: String, paramsMap: Map<*, *>) {
when (contentType) {
TextType -> {
val commentFragment = CommentWebFragment.newInstance(paramsMap)
supportFragmentManager.beginTransaction().replace(R.id.fly_webContainer, commentFragment).commit()
}
}
}
override fun onDestroy() {
super.onDestroy()
UMShareAPI.get(this).release()
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data)
}
}
package com.yidian.shenghuoquan.newscontent.ui
import android.annotation.SuppressLint
import android.app.Activity
import android.content.ClipData
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.webkit.ValueCallback
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
import com.orhanobut.hawk.Hawk
import com.yidian.bcommon.HawkConfig
import com.yidian.bcommon.XRouterPathConstants.Companion.SUPPORT
import com.yidian.bcommon.base.BaseActivity
import com.yidian.bcommon.extensions.initTitleBar
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.databinding.ActivityProtocolBinding
import com.yidian.xarc.xbrid.XBridManager
import com.yidian.xarc.xbrid.XWebView
class ProductSupportActivity : BaseActivity<ActivityProtocolBinding>() {
override fun createViewBinding(): ActivityProtocolBinding {
return ActivityProtocolBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return SUPPORT
}
private val FILE_CHOOSER_RESULT_CODE = 666
private var uploadMessageAboveL: ValueCallback<Array<Uri>>? = null
private lateinit var webView: XWebView
@SuppressLint("SetJavaScriptEnabled")
override fun init(savedInstanceState: Bundle?) {
super.init(savedInstanceState)
initTitle()
webView = XBridManager.getWebView(this, "testidenfier", viewBind.wvProtocol)
webView.settings.javaScriptEnabled = true
val webViewClient: WebViewClient = object : WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
super.shouldOverrideUrlLoading(view, url)
view.loadUrl(url)
return true
}
}
webView.webViewClient = webViewClient
webView.webChromeClient = object : WebChromeClient() {
override fun onShowFileChooser(
webView: WebView?,
filePathCallback: ValueCallback<Array<Uri>>?,
fileChooserParams: FileChooserParams?
): Boolean {
uploadMessageAboveL = filePathCallback
openImageChooserActivity()
return true
}
}
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
val url = "https://support.qq.com/product/304954"
val nickname = Hawk.get(HawkConfig.Nickname, "")
val profileUrl = Hawk.get(HawkConfig.ProfileUrl, "")
val username = Hawk.get(HawkConfig.Username, "")
val postData = "nickname=$nickname&avatar=$profileUrl&openid=$username"
webView.postUrl(url, postData.toByteArray())
}
private fun initTitle() {
initTitleBar(viewBind.include.toolbar, viewBind.include.tvTitle, resources.getString(R.string.my_staff))
}
private fun openImageChooserActivity() {
val i = Intent(Intent.ACTION_GET_CONTENT)
i.addCategory(Intent.CATEGORY_OPENABLE)
i.type = "image/*"
startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE)
}
private fun onActivityResultAboveL(requestCode: Int, resultCode: Int, intent: Intent?) {
if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null) return
var results: Array<Uri>? = null
if (resultCode == Activity.RESULT_OK) {
if (intent != null) {
val dataString = intent.dataString
val clipData: ClipData? = intent.clipData
if (clipData != null) {
results = Array(clipData.itemCount) {
Uri.EMPTY
}
for (i in 0 until clipData.itemCount) {
val item: ClipData.Item = clipData.getItemAt(i)
results[i] = item.uri
}
}
if (dataString != null) results = arrayOf(Uri.parse(dataString))
}
}
uploadMessageAboveL?.onReceiveValue(results)
uploadMessageAboveL = null
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
if (uploadMessageAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, data)
}
}
}
}
package com.yidian.shenghuoquan.newscontent.ui.alive
import android.app.ProgressDialog
import android.os.Bundle
import android.widget.Toast
import com.megvii.meglive_sdk.listener.DetectCallback
import com.megvii.meglive_sdk.listener.PreCallback
import com.megvii.meglive_sdk.manager.MegLiveManager
import com.yidian.bcommon.AppConfig
import com.yidian.bcommon.base.BaseActivity
import com.yidian.bcommon.http.HttpResult
import com.yidian.bcommon.utils.ToolsUtil
import com.yidian.shenghuoquan.newscontent.databinding.ActivityAliveLayoutBinding
import com.yidian.shenghuoquan.newscontent.http.ApiService
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthPersonalGetTokenBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.AuthPersonalGetTokenCallback
import com.yidian.shenghuoquan.newscontent.http.httpbean.IdentifyIdOcrVerifyBean
import com.yidian.shenghuoquan.newscontent.http.httpbean.IdentifyIdOcrVerifyCallback
import com.yidian.shenghuoquan.newscontent.utils.KS3Core
import java.io.File
import java.io.FileOutputStream
import java.io.InputStream
/**
* Author: sym
* Date: 2021/5/19 6:11 PM
* Describe:onPreStart showDialogDismiss onPreFinish progressDialogDismiss
*/
class AliveTestActivity : BaseActivity<ActivityAliveLayoutBinding>(), PreCallback, DetectCallback {
private var sign = ""
private var bizToken = ""
private var megLiveManager: MegLiveManager? = null
private var modelPath = "" // 模型本地存放路径
private var dataPath = "" // 模型本地存放路径
private var mProgressDialog: ProgressDialog? = null
private var idCardName: String? = null
private var idCardNo: String? = null
override fun createViewBinding(): ActivityAliveLayoutBinding {
return ActivityAliveLayoutBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return ""
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initSign()
setOnListener()
idCardName = intent.getStringExtra("idCardName")
idCardNo = intent.getStringExtra("idCardNo")
}
private fun initSign() {
val currtTime = System.currentTimeMillis() / 1000
val expireTime = (System.currentTimeMillis() + 60 * 60 * 100) / 1000
sign = GenerateSign.appSign(AppConfig.KUANGSHI_ALIVE_API_KEY, AppConfig.KUANGSHI_SECRET, currtTime, expireTime)
megLiveManager = MegLiveManager.getInstance()
modelPath = saveAssets("faceidmodel.bin", "model")!!
mProgressDialog = ProgressDialog(this)
mProgressDialog!!.setCancelable(false)
}
private fun setOnListener() {
viewBind.btActionYy.setOnClickListener {
val requestParams = HashMap<String, String?>()
requestParams["id_number"] = idCardNo
requestParams["id_card_name"] = idCardName
requestParams["liveness_type"] = "meglive"
ApiService.authPersonalGetToken(authPersonalGetTokenCallback, requestParams)
}
}
private val authPersonalGetTokenCallback = object : AuthPersonalGetTokenCallback {
override fun getTokenSuccess(t: HttpResult<AuthPersonalGetTokenBean.Response?>?) {
bizToken = t?.result?.biz_token!!
megLiveManager?.preDetect(this@AliveTestActivity, bizToken, "zh", "https://api.megvii.com", modelPath, this@AliveTestActivity)
}
}
private fun saveAssets(fileName: String, path: String): String? {
val dir = File(getExternalFilesDir("megvii"), path)
if (!dir.exists()) {
if (!dir.mkdirs()) {
return null
}
}
val file = File(dir, fileName)
var fos: FileOutputStream? = null
var `is`: InputStream? = null
var ret: String? = null
try {
var count: Int
val buffer = ByteArray(1024)
fos = FileOutputStream(file)
`is` = this.assets.open(fileName)
while (`is`.read(buffer).also { count = it } != -1) {
fos.write(buffer, 0, count)
}
ret = file.absolutePath
} catch (e: Exception) {
e.printStackTrace()
return null
} finally {
try {
fos?.close()
`is`?.close()
} catch (e: Exception) {
e.printStackTrace()
}
}
return ret
}
override fun onPreStart() {
showDialogDismiss()
}
private fun showDialogDismiss() {
runOnUiThread {
mProgressDialog?.show()
}
}
override fun onPreFinish(token: String?, errorCode: Int, errorMessage: String?) {
progressDialogDismiss()
if (errorCode == 1000) {
megLiveManager!!.setVerticalDetectionType(MegLiveManager.DETECT_VERITICAL_FRONT)
megLiveManager!!.startDetect(this@AliveTestActivity)
}
}
private fun progressDialogDismiss() {
runOnUiThread {
if (mProgressDialog != null) {
mProgressDialog!!.dismiss()
}
}
}
override fun onDetectFinish(token: String?, errorCode: Int, errorMessage: String?, data: String?) {
if (errorCode == 1000) {
token?.let { verify(it, data!!.toByteArray()) }
} else {
Toast.makeText(this@AliveTestActivity, errorMessage, Toast.LENGTH_SHORT).show()
}
}
private fun verify(token: String, data: ByteArray) {
showDialogDismiss()
saveFile(ToolsUtil.randomName(), data)
}
private val identifyIdOcrVerifyCallback = object : IdentifyIdOcrVerifyCallback {
override fun identifyIdOcrVerifySuccess(t: HttpResult<IdentifyIdOcrVerifyBean.Response?>?) {
progressDialogDismiss()
if (t!!.result!!.verify_result) {
Toast.makeText(this@AliveTestActivity, "活体检测结果成功 verify_result = true ", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@AliveTestActivity, "活体检测结果失败 msg = ${t.reason}", Toast.LENGTH_SHORT).show()
}
}
override fun identifyIdOcrVerifyFailure(t: HttpResult<IdentifyIdOcrVerifyBean.Response?>?) {
progressDialogDismiss()
}
}
// 将字节流转换成文件
@Throws(Exception::class)
fun saveFile(filename: String, data: ByteArray?) {
if (data != null) {
dataPath = externalCacheDir?.absolutePath + "/alive/meglive"
val file = File(dataPath)
if (file.exists()) {
file.delete()
} else {
file.parentFile?.mkdirs()
file.createNewFile()
}
val fos = FileOutputStream(file)
fos.write(data, 0, data.size)
fos.flush()
fos.close()
KS3Core.INSTANCE.uploadObject(file, KS3Core.ScenarioType.ALIVE_DETECT, object : KS3Core.OnKS3TaskListener {
override fun onTaskStart() {
}
override fun onTaskProgress(progress: Double) {
}
override fun onTaskFinish() {
}
override fun onTaskCancel() {
}
override fun onTaskSuccess(bucket: String?, objectKey: String?) {
val requestParams = HashMap<String, String?>()
requestParams["biz_token"] = bizToken
requestParams["meglive_objectid"] = objectKey
requestParams["meglive_bucket"] = bucket
ApiService.identifyIdOcrVerify(identifyIdOcrVerifyCallback, requestParams)
}
override fun onTaskFailure(statesCode: Int, message: String?) {
}
})
}
}
}
package com.yidian.shenghuoquan.newscontent.ui.alive;
import android.util.Base64;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
/**
* Created by mafuxin on 2018/5/23.
*/
public class GenerateSign {
public static String appSign(String apiKey, String secret, long currtTime, long expireTime) {
try {
int rdm = Math.abs(new Random().nextInt());
String plainText = String.format("a=%s&b=%d&c=%d&d=%d", apiKey, expireTime, currtTime,rdm);
byte[] hmacDigest = HmacSha1(plainText, secret);
byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
plainText.getBytes().length);
return Base64Encode(signContent).replaceAll("[\\s*\t\n\r]", "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 生成base64编码
*
* @param binaryData
* @return
*/
public static String Base64Encode(byte[] binaryData) {
String encodedstr = Base64.encodeToString(binaryData, Base64.DEFAULT);
return encodedstr;
}
/**
* 生成hmacsha1签名
*
* @param binaryData
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(byte[] binaryData, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secretKey);
byte[] HmacSha1Digest = mac.doFinal(binaryData);
return HmacSha1Digest;
}
/**
* 生成hmacsha1签名
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(String plainText, String key) throws Exception {
return HmacSha1(plainText.getBytes(), key);
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.text.SpannableString
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import com.orhanobut.hawk.Hawk
import com.yidian.bcommon.AppConfig.Companion.privacyPolicyStatement
import com.yidian.bcommon.AppConfig.Companion.userProtocol
import com.yidian.bcommon.HawkConfig
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.xpage.XPageManager
/**
* 用户协议 & 隐私政策 弹框
*/
class ProtocolDialog(private val activity: Activity, themeResId: Int, private val paramsMap: HashMap<String, Any?>?) :
Dialog(activity, themeResId) {
private lateinit var tvPrivacyPolicyTwo: YdTextView
private lateinit var tvAgree: YdTextView
private lateinit var tvDisagree: YdTextView
private var lastClickTime = 0L
init {
setDialog()
}
private fun setDialog() {
this.setCanceledOnTouchOutside(false)
this.setContentView(R.layout.protocol_dialog)
this.setOwnerActivity(activity)
tvPrivacyPolicyTwo = findViewById(R.id.tv_privacyPolicyTwo)
tvAgree = findViewById(R.id.tv_agree)
tvDisagree = findViewById(R.id.tv_disagree)
setSpannableString()
setClickListener()
}
private fun setSpannableString() {
tvPrivacyPolicyTwo.highlightColor = Color.TRANSPARENT
val textSpannedBuilder = SpannableStringBuilder()
val textSpanned1 = SpannableString(activity.getString(R.string.privacy_policy_two_first))
val textSpanned2 = SpannableString(activity.getString(R.string.privacy_policy_statement))
textSpanned2.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.lightBlueColor)),
0,
textSpanned2.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
textSpanned2.setSpan(object : ClickableSpan() {
override fun onClick(view: View) {
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolTitleKey] = activity.getString(R.string.privacy_policy_statement)
urlMap[ProtocolActivity.ProtocolUrlKey] = privacyPolicyStatement
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false
}
}, 0, textSpanned2.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
val textSpanned3 = SpannableString(activity.getString(R.string.and))
textSpanned3.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.mainBlackColor)),
0,
textSpanned3.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
val textSpanned4 = SpannableString(activity.getString(R.string.user_protocol))
textSpanned4.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.lightBlueColor)),
0,
textSpanned4.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
textSpanned4.setSpan(object : ClickableSpan() {
override fun onClick(view: View) {
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolTitleKey] = activity.getString(R.string.user_protocol)
urlMap[ProtocolActivity.ProtocolUrlKey] = userProtocol
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false
}
}, 0, textSpanned4.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
val textSpanned5 = SpannableString(activity.getString(R.string.privacy_policy_two_second))
textSpanned5.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.mainBlackColor)),
0,
textSpanned5.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
tvPrivacyPolicyTwo.movementMethod = LinkMovementMethod.getInstance()
tvPrivacyPolicyTwo.text =
textSpannedBuilder.append(textSpanned1).append(textSpanned2).append(textSpanned3).append(textSpanned4).append(textSpanned5)
}
private fun setClickListener() {
tvAgree.setOnClickListener {
Hawk.put(HawkConfig.ProtocolIsAgree, true)
dismiss()
Handler().postDelayed({
XPageManager.push(XRouterPathConstants.NEWS_MAIN, paramsMap)
activity.finish()
}, 1000)
}
tvDisagree.setOnClickListener {
dismiss()
val protocolHintDialog = ProtocolHintDialog(activity, R.style.normal_dialog, paramsMap)
protocolHintDialog.show()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.BOTTOM
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.graphics.Color
import android.os.Bundle
import android.os.Handler
import android.text.SpannableString
import android.text.SpannableStringBuilder
import android.text.Spanned
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.ForegroundColorSpan
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import com.orhanobut.hawk.Hawk
import com.yidian.bcommon.AppConfig.Companion.privacyPolicyStatement
import com.yidian.bcommon.HawkConfig
import com.yidian.bcommon.XRouterPathConstants
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.ui.ProtocolActivity
import com.yidian.xpage.XPageManager
/**
* 用户协议 & 隐私政策的 详细内容提示弹框
*/
class ProtocolHintDialog(private val activity: Activity, themeResId: Int, private val paramsMap: HashMap<String, Any?>?) :
Dialog(activity, themeResId) {
private lateinit var tvContent: YdTextView
private lateinit var tvAgree: YdTextView
private lateinit var tvDisagree: YdTextView
private var lastClickTime = 0L
init {
setDialog()
}
private fun setDialog() {
this.setCanceledOnTouchOutside(false)
this.setContentView(R.layout.protocol_hint_dialog)
this.setOwnerActivity(activity)
tvContent = findViewById(R.id.tv_content)
tvAgree = findViewById(R.id.tv_agree)
tvDisagree = findViewById(R.id.tv_disagree)
setSpannableString()
setClickListener()
}
private fun setSpannableString() {
tvContent.highlightColor = Color.TRANSPARENT
val textSpannedBuilder = SpannableStringBuilder()
val textSpanned1 = SpannableString(activity.getString(R.string.protocol_hint_content_one))
val textSpanned2 = SpannableString(activity.getString(R.string.privacy_policy))
textSpanned2.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.lightBlueColor)),
0,
textSpanned2.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
textSpanned2.setSpan(object : ClickableSpan() {
override fun onClick(view: View) {
val currentClickTime = System.currentTimeMillis()
if (currentClickTime - lastClickTime < 1000) return
lastClickTime = currentClickTime
val urlMap = HashMap<String, String>()
urlMap[ProtocolActivity.ProtocolTitleKey] = activity.resources.getString(R.string.privacy_policy_statement)
urlMap[ProtocolActivity.ProtocolUrlKey] = privacyPolicyStatement
XPageManager.push(XRouterPathConstants.PROTOCOL, urlMap)
}
override fun updateDrawState(ds: TextPaint) {
ds.isUnderlineText = false
}
}, 0, textSpanned2.length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
val textSpanned3 = SpannableString(activity.getString(R.string.protocol_hint_content_two))
textSpanned3.setSpan(
ForegroundColorSpan(activity.resources.getColor(R.color.mainBlackColor)),
0,
textSpanned3.length,
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
)
tvContent.movementMethod = LinkMovementMethod.getInstance()
tvContent.text = textSpannedBuilder.append(textSpanned1).append(textSpanned2).append(textSpanned3)
}
private fun setClickListener() {
tvAgree.setOnClickListener {
Hawk.put(HawkConfig.ProtocolIsAgree, true)
dismiss()
Handler().postDelayed({
XPageManager.push(XRouterPathConstants.NEWS_MAIN, paramsMap)
activity.finish()
}, 1000)
}
tvDisagree.setOnClickListener {
dismiss()
Handler().postDelayed({
activity.finish()
}, 200)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.BOTTOM
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.umeng.socialize.ShareAction
import com.umeng.socialize.UMShareListener
import com.umeng.socialize.bean.SHARE_MEDIA
import com.umeng.socialize.media.UMImage
import com.umeng.socialize.media.UMWeb
import com.yidian.bcommon.YdBaseApplication
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.utils.CheckApkExistUtil
import com.yidian.nightmode.widget.YdRecyclerView
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.ShareAdapter
import com.yidian.shenghuoquan.newscontent.bean.SharePlatformBean
class ShareDialog(private val activity: Activity, themeResId: Int) : Dialog(activity, themeResId) {
private lateinit var rvSharePlatform: YdRecyclerView
private lateinit var tvCancel: YdTextView
private lateinit var shareAdapter: ShareAdapter
private lateinit var contentLink: String
private lateinit var title: String
private val imageBaseUrl = "http://i1.go2yd.com/image.php?url="
private val imageParams = "&type=thumbnail_200x200"
private var imageUrl: String? = null
private lateinit var description: String
private val dataList: ArrayList<SharePlatformBean> by lazy { ArrayList<SharePlatformBean>() }
private lateinit var wechat: SharePlatformBean
private lateinit var wechatMoments: SharePlatformBean
private lateinit var sinaWeibo: SharePlatformBean
private lateinit var qq: SharePlatformBean
private lateinit var copyLink: SharePlatformBean
init {
setDialog()
}
private fun setDialog() {
this.setCanceledOnTouchOutside(true)
this.setContentView(R.layout.share_dialog)
this.setOwnerActivity(activity)
window?.setWindowAnimations(R.style.PopupWindow_anim_style)
rvSharePlatform = findViewById(R.id.rv_sharePlatform)
tvCancel = findViewById(R.id.tv_cancel)
shareAdapter = ShareAdapter()
initPlatform()
setClickListener()
}
fun setData(contentLink: String, title: String, description: String, imageUrl: String?) {
this.contentLink = contentLink
this.title = title
this.imageUrl = imageUrl
this.description = description
}
private fun setClickListener() {
tvCancel.setOnClickListener {
dismiss()
}
shareAdapter.setOnItemClickListener(object : OnItemClickListener<SharePlatformBean> {
override fun onClick(view: View?, position: Int, item: SharePlatformBean?) {
when (position) {
in 0..3 -> oneKeyShare(position)
4 -> copyLink(contentLink)
}
}
})
}
private fun initPlatform() {
wechat = SharePlatformBean(R.mipmap.icon_share_wx, "微信好友", ShareAdapter.normalType)
wechatMoments = SharePlatformBean(R.mipmap.icon_share_pyq, "微信朋友圈", ShareAdapter.normalType)
sinaWeibo = SharePlatformBean(R.mipmap.icon_share_wb, "微博", ShareAdapter.normalType)
qq = SharePlatformBean(R.mipmap.icon_share_qq, "手机QQ", ShareAdapter.normalType)
copyLink = SharePlatformBean(R.mipmap.icon_share_link, "复制链接", ShareAdapter.footType)
dataList.add(wechat)
dataList.add(wechatMoments)
dataList.add(sinaWeibo)
dataList.add(qq)
dataList.add(copyLink)
val layoutManager = LinearLayoutManager(activity)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
rvSharePlatform.layoutManager = layoutManager
rvSharePlatform.adapter = shareAdapter
shareAdapter.update(dataList)
}
private fun copyLink(text: String) {
val cmb = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
cmb?.setPrimaryClip(ClipData.newPlainText(null, text))
Toast.makeText(activity, "复制成功", Toast.LENGTH_SHORT).show()
dismiss()
}
private fun oneKeyShare(position: Int) {
val shareAction = ShareAction(activity)
when (position) {
0 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)) {
shareAction.platform = SHARE_MEDIA.WEIXIN
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
1 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)) {
shareAction.platform = SHARE_MEDIA.WEIXIN_CIRCLE
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
2 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.sinaBlogPkgName)) {
shareAction.platform = SHARE_MEDIA.SINA
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微博】", Toast.LENGTH_SHORT).show()
}
}
3 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.mobileQQPkgName)) {
shareAction.platform = SHARE_MEDIA.QQ
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【QQ】", Toast.LENGTH_SHORT).show()
}
}
}
val web = UMWeb(contentLink)
web.title = title
if (imageUrl != null) {
imageUrl = imageBaseUrl + imageUrl + imageParams
web.setThumb(UMImage(activity, imageUrl))
} else {
web.setThumb(UMImage(activity, R.mipmap.ydlogo))
}
web.description = description
shareAction.setCallback(object : UMShareListener {
override fun onStart(platform: SHARE_MEDIA?) {
}
override fun onResult(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show()
}
override fun onError(platform: SHARE_MEDIA?, t: Throwable?) {
Log.e("zhb-yd", "失败" + t?.message)
}
override fun onCancel(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show()
}
}).withMedia(web).share()
dismiss()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.BOTTOM
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import android.util.Log
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.umeng.socialize.ShareAction
import com.umeng.socialize.UMShareListener
import com.umeng.socialize.bean.SHARE_MEDIA
import com.umeng.socialize.media.UMImage
import com.yidian.bcommon.YdBaseApplication
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.utils.CheckApkExistUtil
import com.yidian.nightmode.widget.YdRecyclerView
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.ShareAdapter
import com.yidian.shenghuoquan.newscontent.bean.SharePlatformBean
class ShareImageDialog(private val activity: Activity, themeResId: Int) : Dialog(activity, themeResId) {
private lateinit var rvSharePlatform: YdRecyclerView
private lateinit var tvCancel: YdTextView
private lateinit var shareAdapter: ShareAdapter
private lateinit var imageUrl: String
private val dataList: ArrayList<SharePlatformBean> by lazy { ArrayList<SharePlatformBean>() }
private lateinit var wechat: SharePlatformBean
private lateinit var wechatMoments: SharePlatformBean
private lateinit var qq: SharePlatformBean
private lateinit var copyLink: SharePlatformBean
init {
setDialog()
}
private fun setDialog() {
this.setCanceledOnTouchOutside(true)
this.setContentView(R.layout.share_dialog)
this.setOwnerActivity(activity)
window?.setWindowAnimations(R.style.PopupWindow_anim_style)
rvSharePlatform = findViewById(R.id.rv_sharePlatform)
tvCancel = findViewById(R.id.tv_cancel)
shareAdapter = ShareAdapter()
initPlatform()
setClickListener()
}
fun setData(imageUrl: String) {
this.imageUrl = imageUrl
}
private fun setClickListener() {
tvCancel.setOnClickListener {
dismiss()
}
shareAdapter.setOnItemClickListener(object : OnItemClickListener<SharePlatformBean> {
override fun onClick(view: View?, position: Int, item: SharePlatformBean?) {
when (position) {
in 0..2 -> oneKeyShare(position, imageUrl)
3 -> copyLink(imageUrl)
}
}
})
}
private fun initPlatform() {
wechat = SharePlatformBean(R.mipmap.icon_share_wx, "微信好友", ShareAdapter.normalType)
wechatMoments = SharePlatformBean(R.mipmap.icon_share_pyq, "微信朋友圈", ShareAdapter.normalType)
qq = SharePlatformBean(R.mipmap.icon_share_qq, "手机QQ", ShareAdapter.normalType)
copyLink = SharePlatformBean(R.mipmap.icon_share_link, "复制链接", ShareAdapter.footType)
dataList.add(wechat)
dataList.add(wechatMoments)
dataList.add(qq)
dataList.add(copyLink)
val layoutManager = LinearLayoutManager(activity)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
rvSharePlatform.layoutManager = layoutManager
rvSharePlatform.adapter = shareAdapter
shareAdapter.update(dataList)
}
private fun copyLink(text: String) {
val cmb = activity.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
cmb?.setPrimaryClip(ClipData.newPlainText(null, text))
Toast.makeText(activity, "复制成功", Toast.LENGTH_SHORT).show()
dismiss()
}
private fun oneKeyShare(position: Int, imageUrl: String) {
val shareAction = ShareAction(activity)
when (position) {
0 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)) {
shareAction.platform = SHARE_MEDIA.WEIXIN
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
1 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)) {
shareAction.platform = SHARE_MEDIA.WEIXIN_CIRCLE
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
2 -> {
if (CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.mobileQQPkgName)) {
shareAction.platform = SHARE_MEDIA.QQ
} else {
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【QQ】", Toast.LENGTH_SHORT).show()
}
}
}
val image = UMImage(activity, imageUrl)
val thumb = UMImage(activity, imageUrl)
image.setThumb(thumb)
shareAction.setCallback(object : UMShareListener {
override fun onStart(platform: SHARE_MEDIA?) {
}
override fun onResult(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show()
}
override fun onError(platform: SHARE_MEDIA?, t: Throwable?) {
Log.e("zhb-yd", "失败" + t?.message)
}
override fun onCancel(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show()
}
}).withMedia(image).share()
dismiss()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.BOTTOM
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import android.view.Gravity
import android.view.View
import android.view.WindowManager
import android.widget.ImageView
import android.widget.Toast
import androidx.recyclerview.widget.GridLayoutManager
import com.umeng.socialize.ShareAction
import com.umeng.socialize.UMShareListener
import com.umeng.socialize.bean.SHARE_MEDIA
import com.umeng.socialize.media.UMImage
import com.yidian.bcommon.YdBaseApplication
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.utils.CheckApkExistUtil
import com.yidian.bcommon.utils.YdFileUtils
import com.yidian.nightmode.widget.YdRecyclerView
import com.yidian.nightmode.widget.YdRelativeLayout
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.ShareAdapter
import com.yidian.shenghuoquan.newscontent.bean.SharePlatformBean
class SharePosterDialog(private val activity: Activity, themeResId: Int): Dialog(activity, themeResId) {
private lateinit var rvSharePlatform: YdRecyclerView
private lateinit var tvCancel: YdTextView
private lateinit var rlyRoot: YdRelativeLayout
private lateinit var rlyPoster: YdRelativeLayout
private lateinit var shareAdapter: ShareAdapter
private lateinit var contentLink: String
private lateinit var poster: View
private val dataList: ArrayList<SharePlatformBean> by lazy { ArrayList<SharePlatformBean>() }
private lateinit var saveImage: SharePlatformBean
private lateinit var wechat: SharePlatformBean
private lateinit var wechatMoments: SharePlatformBean
private lateinit var qq: SharePlatformBean
init {
setDialog()
}
private fun setDialog(){
this.setCanceledOnTouchOutside(true)
this.setContentView(R.layout.share_image_dialog)
this.setOwnerActivity(activity)
window?.setWindowAnimations(R.style.PopupWindow_anim_style)
rvSharePlatform = findViewById(R.id.rv_sharePlatform)
tvCancel = findViewById(R.id.tv_cancel)
rlyRoot = findViewById(R.id.rly_root)
rlyPoster = findViewById(R.id.rly_poster)
shareAdapter = ShareAdapter()
initPlatform()
setClickListener()
}
fun setData(contentLink: String, poster: View, ivQRCode: ImageView){
this.contentLink = contentLink
this.poster = poster
initPoster(ivQRCode)
}
private fun initPoster(ivQRCode: ImageView){
val qrCodeBitmap = YdFileUtils.createQRCodeBitmap(contentLink, 200, 200)
if(qrCodeBitmap != null){
ivQRCode.setImageBitmap(qrCodeBitmap)
}
rlyPoster.addView(poster)
}
private fun initPlatform(){
saveImage = SharePlatformBean(R.mipmap.icon_save_card, "保存图片", ShareAdapter.headType)
wechat = SharePlatformBean(R.mipmap.icon_share_wx, "微信好友", ShareAdapter.normalType)
wechatMoments = SharePlatformBean(R.mipmap.icon_share_pyq, "微信朋友圈", ShareAdapter.normalType)
qq = SharePlatformBean(R.mipmap.icon_share_qq, "手机QQ", ShareAdapter.normalType)
dataList.add(saveImage)
dataList.add(wechat)
dataList.add(wechatMoments)
dataList.add(qq)
rvSharePlatform.layoutManager = GridLayoutManager(activity, 4)
rvSharePlatform.adapter = shareAdapter
shareAdapter.update(dataList)
}
private fun setClickListener(){
tvCancel.setOnClickListener{
dismiss()
}
shareAdapter.setOnItemClickListener(object : OnItemClickListener<SharePlatformBean> {
override fun onClick(view: View?, position: Int, item: SharePlatformBean?) {
when (position) {
0 -> saveImage()
in 1..3 -> oneKeyShare(position)
}
}
})
rlyRoot.setOnClickListener {
dismiss()
}
}
private fun saveImage(){
val bitmap = YdFileUtils.createBitmap(poster)
val imagePath = YdFileUtils.saveImageFromView(activity, bitmap)
if(!TextUtils.isEmpty(imagePath)){
Toast.makeText(activity, "图片保存成功", Toast.LENGTH_SHORT).show()
}
dismiss()
}
private fun oneKeyShare(position: Int){
val shareAction = ShareAction(activity)
when(position){
1 -> {
if(CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)){
shareAction.platform = SHARE_MEDIA.WEIXIN
}else{
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
2 -> {
if(CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.weChatPkgName)){
shareAction.platform = SHARE_MEDIA.WEIXIN_CIRCLE
}else{
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【微信】", Toast.LENGTH_SHORT).show()
}
}
3 -> {
if(CheckApkExistUtil.checkApkExist(YdBaseApplication.context, CheckApkExistUtil.mobileQQPkgName)){
shareAction.platform = SHARE_MEDIA.QQ
}else{
Toast.makeText(YdBaseApplication.context, "分享失败,未安装【QQ】", Toast.LENGTH_SHORT).show()
}
}
}
val bitmap = YdFileUtils.createBitmap(poster)
if(bitmap != null){
val image = UMImage(activity, bitmap)
val thumb = UMImage(activity, bitmap)
image.setThumb(thumb)
shareAction.setCallback(object : UMShareListener {
override fun onStart(platform: SHARE_MEDIA?) {
}
override fun onResult(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享成功", Toast.LENGTH_SHORT).show()
}
override fun onError(platform: SHARE_MEDIA?, t: Throwable?) {
Log.e("zhb-yd", "失败" + t?.message)
}
override fun onCancel(platform: SHARE_MEDIA?) {
Toast.makeText(activity, "分享取消", Toast.LENGTH_SHORT).show()
}
}).withMedia(image).share()
}
dismiss()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.BOTTOM
}
}
package com.yidian.shenghuoquan.newscontent.ui.dialog
import android.app.Activity
import android.app.Dialog
import android.os.Bundle
import android.view.Gravity
import android.view.KeyEvent
import android.view.View
import android.view.WindowManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.bcommon.widget.YdMaxRecyclerView
import com.yidian.nightmode.widget.YdImageView
import com.yidian.nightmode.widget.YdTextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.UpdateVersionDesAdapter
import com.yidian.shenghuoquan.newscontent.bean.IUpdateDialogCallback
import com.yidian.yac.pm.appupdate.AppUpdateEchoData
import com.yidian.yac.pm.appupdate.AppUpdateInfo
class UpdateVersionDialog(private val activity: Activity, themeResId: Int, private val updateDialogCallback :IUpdateDialogCallback): Dialog(activity, themeResId) {
private lateinit var ivUpdateClose: YdImageView
private lateinit var tvNewVersion: YdTextView
private lateinit var tvDown: YdTextView
private lateinit var rvDes: YdMaxRecyclerView
private lateinit var updateInfo: AppUpdateInfo<AppUpdateEchoData>
private val adapter = UpdateVersionDesAdapter()
init {
setDialog()
}
private fun setDialog(){
this.setCanceledOnTouchOutside(false)
this.setContentView(R.layout.update_version_dialog)
this.setOwnerActivity(activity)
ivUpdateClose = findViewById(R.id.iv_updateClose)
tvNewVersion = findViewById(R.id.tv_newVersion)
tvDown = findViewById(R.id.tv_down)
rvDes = findViewById(R.id.rv_des)
rvDes.layoutManager = LinearLayoutManager(activity)
rvDes.adapter = adapter
setClickListener()
}
fun setData(updateInfo: AppUpdateInfo<AppUpdateEchoData>){
this.updateInfo = updateInfo
val forceUpdate = updateInfo.echo_data?.force_update
if(forceUpdate == true){
ivUpdateClose.visibility = View.GONE
}else{
ivUpdateClose.visibility = View.VISIBLE
}
val resultInfo = updateInfo.result?.get(0)
val versionShow = resultInfo?.package_version
tvNewVersion.text = "发现新版本V$versionShow"
var note = resultInfo?.note
var desList: ArrayList<String>? = null
if(!note.isNullOrEmpty()){
if(note.endsWith(";") || note.endsWith(";")){
note = note.substring(0, note.length - 1)
}
when {
note.contains(";") -> {
desList = note.split(";") as ArrayList<String>
}
note.contains(";") -> {
desList = note.split(";") as ArrayList<String>
}
else -> {
desList = ArrayList()
desList.add(note)
}
}
}
if(desList != null){
adapter.update(desList)
}
}
private fun setClickListener(){
ivUpdateClose.setOnClickListener {
dismiss()
}
tvDown.setOnClickListener {
tvDown.isEnabled = false
tvDown.setBackgroundResource(R.drawable.bg_gray_radio)
tvDown.text = "下载中..."
updateDialogCallback.downloadCallback(updateInfo)
}
setOnKeyListener { _, keyCode, event -> keyCode == KeyEvent.KEYCODE_BACK && event?.repeatCount == 0 }
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val params: WindowManager.LayoutParams? = window?.attributes
params?.width = WindowManager.LayoutParams.MATCH_PARENT
params?.height = WindowManager.LayoutParams.WRAP_CONTENT
window?.attributes = params
window?.attributes?.gravity = Gravity.CENTER
}
}
package com.yidian.shenghuoquan.newscontent.ui.idcard
import android.graphics.BitmapFactory
import android.os.Bundle
import com.yidian.bcommon.base.BaseActivity
import com.yidian.bcommon.utils.ToolsUtil
import com.yidian.shenghuoquan.newscontent.databinding.ActivityIdcardResultBinding
/**
* Author: sym
* Date: 2021/5/20 6:51 PM
* Describe:
*/
class IDCardResultActivity:BaseActivity<ActivityIdcardResultBinding>() {
override fun createViewBinding(): ActivityIdcardResultBinding {
return ActivityIdcardResultBinding.inflate(layoutInflater)
}
override fun getXPageName(): String {
return ""
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intent = intent
val bundle = intent.extras
val portraitimg = bundle!!.getByteArray("portraitimg_bitmap")
val iDCardImg = bundle.getByteArray("idcardimg_bitmap")
if (portraitimg != null) {
val bmpPortraitImg = BitmapFactory.decodeByteArray(portraitimg, 0, portraitimg.size)
viewBind.resultFaceImage.setImageBitmap(bmpPortraitImg)
}
if (iDCardImg != null) {
val bmpIDCardImg = BitmapFactory.decodeByteArray(iDCardImg, 0, iDCardImg.size)
viewBind.resultIdcardImage.setImageBitmap(bmpIDCardImg)
ToolsUtil.saveImage(bmpIDCardImg, ToolsUtil.randomName() + ".jpg", this)
}
}
}
package com.yidian.shenghuoquan.newscontent.ui.popwindow
import android.app.Activity
import android.graphics.drawable.ColorDrawable
import android.view.*
import android.widget.PopupWindow
import androidx.recyclerview.widget.LinearLayoutManager
import com.yidian.bcommon.cardutils.adapter.OnItemClickListener
import com.yidian.bcommon.widget.YdMaxRecyclerView
import com.yidian.nightmode.widget.YdImageView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.adapter.FeedbackDetailAdapter
import com.yidian.shenghuoquan.newscontent.bean.FeedbackBean
import com.yidian.utils.ToastUtil
class FeedbackDetailPopupWindow(private val activity: Activity, private val parent: View, private val feedbackBean: FeedbackBean, private val feedbackType: String) {
companion object{
const val SHIELD = "shield"
const val FEEDBACK = "feedback"
}
private val view: View = LayoutInflater.from(activity).inflate(R.layout.feedback_detail_popup_window, null)
private val rvContent = view.findViewById<YdMaxRecyclerView>(R.id.rv_content)
private val ivBack = view.findViewById<YdImageView>(R.id.iv_back)
private val mPopUpWindow = PopupWindow(view)
private val adapter: FeedbackDetailAdapter by lazy { FeedbackDetailAdapter() }
init {
mPopUpWindow.isFocusable = false
mPopUpWindow.isTouchable = true
mPopUpWindow.isOutsideTouchable = true
initView()
setClickListener()
}
private fun initView(){
rvContent.layoutManager = LinearLayoutManager(activity)
rvContent.adapter = adapter
when(feedbackType){
SHIELD -> adapter.update(feedbackBean.tag)
FEEDBACK -> adapter.update(feedbackBean.reason)
}
}
private fun setClickListener(){
mPopUpWindow.setOnDismissListener {
val lp: WindowManager.LayoutParams = activity.window.attributes
lp.alpha = 1.0f
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
activity.window.attributes = lp
}
ivBack.setOnClickListener {
dismiss()
val feedbackPopupWindow = FeedbackPopupWindow(activity, parent, feedbackBean)
feedbackPopupWindow.show()
}
adapter.setOnItemClickListener(object : OnItemClickListener<String> {
override fun onClick(view: View?, position: Int, item: String?) {
item?.let {
ToastUtil.showToast(activity, "将为您减少此类内容推荐")
dismiss()
}
}
})
}
fun show(){
if (activity.isFinishing) {
return
}
mPopUpWindow.width = ViewGroup.LayoutParams.MATCH_PARENT
mPopUpWindow.height = ViewGroup.LayoutParams.WRAP_CONTENT
mPopUpWindow.setBackgroundDrawable(ColorDrawable(0x00000000))
mPopUpWindow.isOutsideTouchable = true
mPopUpWindow.isFocusable = true
mPopUpWindow.animationStyle = R.style.PopupWindow_anim_style
mPopUpWindow.showAtLocation(parent, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, 0, 0)
val lp: WindowManager.LayoutParams = activity.window.attributes
lp.alpha = 0.6f
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
activity.window.attributes = lp
}
fun dismiss() {
if (mPopUpWindow.isShowing) {
mPopUpWindow.dismiss()
}
}
}
package com.yidian.shenghuoquan.newscontent.ui.popwindow
import android.app.Activity
import android.graphics.drawable.ColorDrawable
import android.view.*
import android.widget.PopupWindow
import com.yidian.bcommon.utils.YdToastUtil
import com.yidian.nightmode.widget.YdLinearLayout
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.bean.FeedbackBean
class FeedbackPopupWindow(private val activity: Activity, private val parent: View, private val feedbackBean: FeedbackBean) {
private val view: View = LayoutInflater.from(activity).inflate(R.layout.feedback_popup_window, null)
private val llyUninterested = view.findViewById<YdLinearLayout>(R.id.lly_uninterested)
private val llyShield = view.findViewById<YdLinearLayout>(R.id.lly_shield)
private val llyInferior = view.findViewById<YdLinearLayout>(R.id.lly_inferior)
private val llyBlock = view.findViewById<YdLinearLayout>(R.id.lly_block)
private val mPopUpWindow = PopupWindow(view)
init {
mPopUpWindow.isFocusable = false
mPopUpWindow.isTouchable = true
mPopUpWindow.isOutsideTouchable = true
setClickListener()
}
private fun setClickListener(){
mPopUpWindow.setOnDismissListener {
val lp: WindowManager.LayoutParams = activity.window.attributes
lp.alpha = 1.0f
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
activity.window.attributes = lp
}
llyUninterested.setOnClickListener {
val imgUrl = "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fpic.90sjimg.com%2Fdesign%2F01%2F40%2F17%2F07%2F58f7227f997dc.png&refer=http%3A%2F%2Fpic.90sjimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1614927945&t=8957cd0434852595d03de955b704416e"
YdToastUtil.showToast(activity, "将为您减少此类内容推荐", imgUrl)
dismiss()
}
llyShield.setOnClickListener {
dismiss()
val feedbackDetailPopupWindow = FeedbackDetailPopupWindow(activity, parent, feedbackBean, FeedbackDetailPopupWindow.SHIELD)
feedbackDetailPopupWindow.show()
}
llyInferior.setOnClickListener {
dismiss()
val feedbackDetailPopupWindow = FeedbackDetailPopupWindow(activity, parent, feedbackBean, FeedbackDetailPopupWindow.FEEDBACK)
feedbackDetailPopupWindow.show()
}
llyBlock.setOnClickListener {
YdToastUtil.showToast(activity, "将为您减少此类内容推荐")
dismiss()
}
}
fun show(){
if (activity.isFinishing) {
return
}
mPopUpWindow.width = ViewGroup.LayoutParams.MATCH_PARENT
mPopUpWindow.height = ViewGroup.LayoutParams.WRAP_CONTENT
mPopUpWindow.setBackgroundDrawable(ColorDrawable(0x00000000))
mPopUpWindow.isOutsideTouchable = true
mPopUpWindow.isFocusable = true
mPopUpWindow.animationStyle = R.style.PopupWindow_anim_style
mPopUpWindow.showAtLocation(parent, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL, 0, 0)
val lp: WindowManager.LayoutParams = activity.window.attributes
lp.alpha = 0.6f
activity.window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
activity.window.attributes = lp
}
fun dismiss() {
if (mPopUpWindow.isShowing) {
mPopUpWindow.dismiss()
}
}
}
package com.yidian.shenghuoquan.newscontent.viewholder package com.yidian.shenghuoquan.newscontent.ui.store.viewholder
import android.view.View import android.view.View
import android.widget.TextView import android.widget.TextView
......
package com.yidian.shenghuoquan.newscontent.utils
import android.text.TextUtils
import com.google.gson.Gson
import com.orhanobut.hawk.Hawk
import com.yidian.bcommon.HawkConfig
import com.yidian.bcommon.utils.EncryptUtil
import com.yidian.framework.mobile.xdiamond.SecretUtil
import com.yidian.shenghuoquan.newscontent.bean.TokenBean
import java.util.*
class AccountUtil {
companion object {
@Synchronized
fun getGuestUsername(): String {
var username = Hawk.get(HawkConfig.GuestAccountUsername, "")
if (TextUtils.isEmpty(username)) {
username = try {
val uuid = UUID.randomUUID()
"HG_$uuid"
} catch (e: Exception) {
//做必要的保护
val r = Random()
val d = Date()
r.setSeed(d.time)
val random = r.nextInt(10000)
"HG_" + System.currentTimeMillis() + '-' + random
}
}
return username
}
fun getPassword(username: String): String {
val strLower = username.toLowerCase()
val strMd5 = EncryptUtil.getMD5(username)
val strTemp = strLower + strMd5
return encryptMore(strTemp, 1000)
}
private fun encryptMore(str: String, count: Int): String {
val strTemp = EncryptUtil.encryptToSHA(str)
val num = count - 1
return if (num > 0) {
encryptMore(strTemp, num)
} else {
strTemp
}
}
fun getToken(username: String, password: String): String? {
val secret = SecretUtil.sign(username + password)
val tokenBean = TokenBean(secret, username, password)
val jsonString = Gson().toJson(tokenBean)
return SecretUtil.rsaEncrypt(jsonString)
}
}
}
package com.yidian.shenghuoquan.newscontent.utils;
import android.app.Activity;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.view.Gravity;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.WindowManager.LayoutParams;
import android.widget.PopupWindow;
public class HeightProvider extends PopupWindow implements OnGlobalLayoutListener {
private final Activity mActivity;
private final View rootView;
private HeightListener listener;
private static int heightMax; // 记录popup内容区的最大高度
private static int keyboardHeight; // 记录keyboard高
public HeightProvider(Activity activity) {
super(activity);
this.mActivity = activity;
// 基础配置
rootView = new View(activity);
setContentView(rootView);
// 监听全局Layout变化
rootView.getViewTreeObserver().addOnGlobalLayoutListener(this);
setBackgroundDrawable(new ColorDrawable(0));
// 设置宽度为0,高度为全屏
setWidth(0);
setHeight(LayoutParams.MATCH_PARENT);
// 设置键盘弹出方式
setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
public HeightProvider init() {
if (!isShowing()) {
final View view = mActivity.getWindow().getDecorView();
// 延迟加载popupwindow,如果不加延迟就会报错
view.post(() -> showAtLocation(view, Gravity.NO_GRAVITY, 0, 0));
}
return this;
}
public HeightProvider setHeightListener(HeightListener listener) {
this.listener = listener;
return this;
}
@Override
public void onGlobalLayout() {
Rect rect = new Rect();
rootView.getWindowVisibleDisplayFrame(rect);
if (rect.bottom > heightMax) {
heightMax = rect.bottom;
}
// 两者的差值就是键盘的高度
keyboardHeight = heightMax - rect.bottom;
if (listener != null) {
listener.onHeightChanged(heightMax, keyboardHeight);
}
}
public interface HeightListener {
void onHeightChanged(int heightMax, int height);
}
public static boolean isKeyboardShowing() {
return keyboardHeight > heightMax / 3;
}
public static int getHeightMax() {
return heightMax;
}
}
package com.yidian.shenghuoquan.newscontent.utils;
import android.os.Build;
import android.text.TextUtils;
import androidx.annotation.StringDef;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author sun on 2018/7/5.
*/
public class RomUtils {
private static final String TAG = "RomUtils";
static final String ROM_MIUI = "MIUI";
static final String ROM_EMUI = "EMUI";
static final String ROM_VIVO = "VIVO";
static final String ROM_OPPO = "OPPO";
static final String ROM_FLYME = "FLYME";
static final String ROM_SMARTISAN = "SMARTISAN";
static final String ROM_QIKU = "QIKU";
static final String ROM_LETV = "LETV";
static final String ROM_LENOVO = "LENOVO";
static final String ROM_NUBIA = "NUBIA";
static final String ROM_ZTE = "ZTE";
static final String ROM_COOLPAD = "COOLPAD";
static final String ROM_UNKNOWN = "UNKNOWN";
@StringDef({
ROM_MIUI, ROM_EMUI, ROM_VIVO, ROM_OPPO, ROM_FLYME,
ROM_SMARTISAN, ROM_QIKU, ROM_LETV, ROM_LENOVO, ROM_ZTE,
ROM_COOLPAD, ROM_UNKNOWN
})
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface RomName {
}
private static final String SYSTEM_VERSION_MIUI = "ro.miui.ui.version.name";
private static final String SYSTEM_VERSION_EMUI = "ro.build.version.emui";
private static final String SYSTEM_VERSION_VIVO = "ro.vivo.os.version";
private static final String SYSTEM_VERSION_OPPO = "ro.build.version.opporom";
private static final String SYSTEM_VERSION_FLYME = "ro.build.display.id";
private static final String SYSTEM_VERSION_SMARTISAN = "ro.smartisan.version";
private static final String SYSTEM_VERSION_LETV = "ro.letv.eui";
private static final String SYSTEM_VERSION_LENOVO = "ro.lenovo.lvp.version";
private static String getSystemProperty(String propName) {
return SystemProperties.get(propName, null);
}
@RomName
public static String getRomName() {
if (isMiuiRom()) {
return ROM_MIUI;
}
if (isHuaweiRom()) {
return ROM_EMUI;
}
if (isVivoRom()) {
return ROM_VIVO;
}
if (isOppoRom()) {
return ROM_OPPO;
}
if (isMeizuRom()) {
return ROM_FLYME;
}
if (isSmartisanRom()) {
return ROM_SMARTISAN;
}
if (is360Rom()) {
return ROM_QIKU;
}
if (isLetvRom()) {
return ROM_LETV;
}
if (isLenovoRom()) {
return ROM_LENOVO;
}
if (isZTERom()) {
return ROM_ZTE;
}
if (isCoolPadRom()) {
return ROM_COOLPAD;
}
return ROM_UNKNOWN;
}
public static String getDeviceManufacture() {
if (isMiuiRom()) {
return "小米";
}
if (isHuaweiRom()) {
return "华为";
}
if (isVivoRom()) {
return ROM_VIVO;
}
if (isOppoRom()) {
return ROM_OPPO;
}
if (isMeizuRom()) {
return "魅族";
}
if (isSmartisanRom()) {
return "锤子";
}
if (is360Rom()) {
return "奇酷";
}
if (isLetvRom()) {
return "乐视";
}
if (isLenovoRom()) {
return "联想";
}
if (isZTERom()) {
return "中兴";
}
if (isCoolPadRom()) {
return "酷派";
}
return Build.MANUFACTURER;
}
public static boolean isMiuiRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_MIUI));
}
public static boolean isHuaweiRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_EMUI));
}
public static boolean isVivoRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_VIVO));
}
public static boolean isOppoRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_OPPO));
}
public static boolean isMeizuRom() {
String meizuFlymeOSFlag = getSystemProperty(SYSTEM_VERSION_FLYME);
return !TextUtils.isEmpty(meizuFlymeOSFlag) && meizuFlymeOSFlag.toUpperCase().contains(ROM_FLYME);
}
public static boolean isSmartisanRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_SMARTISAN));
}
public static boolean is360Rom() {
String manufacturer = Build.MANUFACTURER;
return !TextUtils.isEmpty(manufacturer) && manufacturer.toUpperCase().contains(ROM_QIKU);
}
public static boolean isLetvRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_LETV));
}
public static boolean isLenovoRom() {
return !TextUtils.isEmpty(getSystemProperty(SYSTEM_VERSION_LENOVO));
}
public static boolean isCoolPadRom() {
String model = Build.MODEL;
String fingerPrint = Build.FINGERPRINT;
return (!TextUtils.isEmpty(model) && model.toLowerCase().contains(ROM_COOLPAD))
|| (!TextUtils.isEmpty(fingerPrint) && fingerPrint.toLowerCase().contains(ROM_COOLPAD));
}
public static boolean isZTERom() {
String manufacturer = Build.MANUFACTURER;
String fingerPrint = Build.FINGERPRINT;
boolean b = fingerPrint.toLowerCase().contains(ROM_NUBIA)
|| fingerPrint.toLowerCase().contains(ROM_ZTE);
return (!TextUtils.isEmpty(manufacturer) && b)
|| (!TextUtils.isEmpty(fingerPrint) && b);
}
public static boolean isDomesticSpecialRom() {
return RomUtils.isMiuiRom()
|| RomUtils.isHuaweiRom()
|| RomUtils.isMeizuRom()
|| RomUtils.is360Rom()
|| RomUtils.isOppoRom()
|| RomUtils.isVivoRom()
|| RomUtils.isLetvRom()
|| RomUtils.isZTERom()
|| RomUtils.isLenovoRom()
|| RomUtils.isCoolPadRom();
}
public static boolean isSmartisanR1() {
return Build.MODEL.contains("DE106");
}
/**
* Vivo沙雕刘海屏判断
*
* @return
*/
public static boolean isVivoStupidNotch() {
return isVivoX21() || isVivoX21S() || isVivoX23() || isVivoZ1() || isVivoZ3() ||
isVivoY81s() || isVivoY83() || isVivoY85() || isVivoY93() || isVivoY97();
}
public static boolean isVivoX21() {
return Build.MODEL.contains("vivo X21");
}
public static boolean isVivoX21S() {
return Build.MODEL.contains("V1814");
}
public static boolean isVivoX23() {
//X23普通 幻彩版
return Build.MODEL.contains("V1809") || Build.MODEL.contains("V1816");
}
public static boolean isVivoZ1() {
return Build.MODEL.contains("V1730");
}
public static boolean isVivoZ3() {
return Build.MODEL.contains("V1813BA");
}
public static boolean isVivoY81s() {
return Build.MODEL.contains("V1732");
}
public static boolean isVivoY83() {
return Build.MODEL.contains("Y83");
}
public static boolean isVivoY85() {
return Build.MODEL.contains("vivo Y85");
}
public static boolean isVivoY93() {
return Build.MODEL.contains("V1818");
}
public static boolean isVivoY97() {
return Build.MODEL.contains("V1813A") || Build.MODEL.contains("V1813T");
}
public static boolean isHonorV10() {
return Build.MODEL.contains("BKL-AL00");
}
public static boolean isHonor10() {
return Build.MODEL.contains("COL-AL10");
}
public static boolean isMiPad4() {
return TextUtils.equals(Build.MODEL, "MI PAD 4");
}
}
package com.yidian.shenghuoquan.newscontent.utils;
import android.text.TextUtils;
import java.lang.reflect.Method;
/**
* @author sun on 2018/7/5.
*/
public class SystemProperties {
private static final Method getStringProperty = getMethod(getClass("android.os.SystemProperties"));
private static Class<?> getClass(String name) {
try {
Class<?> cls = Class.forName(name);
if (cls == null) {
throw new ClassNotFoundException();
}
return cls;
} catch (ClassNotFoundException e) {
try {
return ClassLoader.getSystemClassLoader().loadClass(name);
} catch (ClassNotFoundException e1) {
return null;
}
}
}
private static Method getMethod(Class<?> clz) {
if (clz == null) return null;
try {
return clz.getMethod("get", String.class);
} catch (Exception e) {
return null;
}
}
public static String get(String key) {
if (getStringProperty != null) {
try {
Object value = getStringProperty.invoke(null, key);
if (value == null) {
return "";
}
return trimToEmpty(value.toString());
} catch (Exception ignored) {
}
}
return "";
}
public static String get(String key, String def) {
if (getStringProperty != null) {
try {
String value = (String) getStringProperty.invoke(null, key);
return defaultString(trimToNull(value), def);
} catch (Exception ignored) {
}
}
return def;
}
private static String defaultString(String str, String defaultStr) {
return str == null ? defaultStr : str;
}
private static String trimToNull(String str) {
String ts = trim(str);
return TextUtils.isEmpty(ts) ? null : ts;
}
private static String trimToEmpty(String str) {
return str == null ? "" : str.trim();
}
private static String trim(String str) {
return str == null ? null : str.trim();
}
}
package com.yidian.shenghuoquan.newscontent.utils
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody.Companion.asRequestBody
import java.io.File
class UploadFileUtils {
companion object{
fun fileToMultipartBodyPart(fileKey: String, file: File): MultipartBody.Part{
val requestFile = file.asRequestBody("multipart/form-data".toMediaTypeOrNull())
return MultipartBody.Part.createFormData(fileKey, file.name, requestFile)
}
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.utils
import com.yidian.shenghuoquan.newscontent.audio.AudioPlayerManager
val audioManager: AudioPlayerManager by lazy { AudioPlayerManager.instance }
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget;
import android.annotation.SuppressLint;
import android.content.Context;
import android.text.Layout;
import android.text.NoCopySpan;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.NonNull;
import com.yidian.nightmode.widget.YdTextView;
import com.yidian.shenghuoquan.newscontent.R;
public class ExpandTextView extends YdTextView {
private static final String TAG = "ExpandTextView";
private String originText = ""; //原始内容文本
private int initWidth = 0; //TextView可展示宽度
private int mMaxLines = 2; //TextView最大显示行数
private SpannableString SPAN_CLOSE = null; //收起的文本(颜色处理和点击监听)
private SpannableString SPAN_EXPAND = null; //展开的文本(颜色处理和点击监听)
private String TEXT_EXPAND = " 展开";
private String TEXT_CLOSE = " 收起";
private int SPAN_COLOR = R.color.video_transparent_50;
private boolean isClose = true;
private boolean isWidthModify = true; //用于控件宽高改变时通知重绘的判断,避免循环绘制
private ExpandClickListener l;
public ExpandTextView(Context context) {
super(context);
}
public ExpandTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ExpandTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
initWidth = getMeasuredWidth();
if(isWidthModify) {
notifyRefreshView();
isWidthModify = false;
}
}
/**
* 初始化"展开"的Span文本,即收起状态的文本尾
*/
private void initCloseEnd(){
String content = TEXT_EXPAND;
SPAN_CLOSE = new SpannableString(content);
SPAN_CLOSE.setSpan(new NoRefCopySpan() {
@SuppressLint("ResourceType")
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(getResources().getColor(SPAN_COLOR));
ds.setUnderlineText(false);
}
@Override
public void onClick(@NonNull View widget) {
if (l!=null){
l.onClick(true);
}
ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
setExpandText(originText);
}
}, 0, content.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
/**
* 初始化"收起"的Span文本,即展开状态的文本尾
*/
private void initExpandEnd(){
String content = TEXT_CLOSE;
SPAN_EXPAND = new SpannableString(content);
SPAN_EXPAND.setSpan(new NoRefCopySpan() {
@SuppressLint("ResourceType")
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(getResources().getColor(SPAN_COLOR));
ds.setUnderlineText(false);
}
@Override
public void onClick(@NonNull View widget) {
if (l!=null){
l.onClick(false);
}
ExpandTextView.super.setMaxLines(mMaxLines);
setCloseText(originText);
}
}, 0, content.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
/**
* 设置收起状态时的文本
*/
private void setCloseText(CharSequence text) {
if(SPAN_CLOSE == null){
initCloseEnd();
}
boolean appendShowAll = false;//true不需要展开收起功能(文件行数小于或等于最大行),false需要展开收起功能
originText = text.toString();
int maxLines = getMaxLines();
String workingText = originText;
if (maxLines != -1) {
Layout layout = createWorkingLayout(workingText);
if (layout.getLineCount() > maxLines) {
//获取一行显示字符个数,然后截取字符串数
workingText = originText.substring(0, layout.getLineEnd(maxLines - 1)).trim();// 收起状态原始文本截取展示的部分
String showText = originText.substring(0, layout.getLineEnd(maxLines - 1)).trim() + "..." + SPAN_CLOSE;
Layout layout2 = createWorkingLayout(showText);
//对workingText进行-1截取,直到展示行数==最大行数,并且添加SPAN_CLOSE后刚好占满最后一行
while (layout2.getLineCount() > maxLines) {
int lastSpace = workingText.length()-1;
if (lastSpace == -1) {
break;
}
workingText = workingText.substring(0, lastSpace);
layout2 = createWorkingLayout(workingText + "..." + SPAN_CLOSE);
}
appendShowAll = true;
workingText = workingText + "...";
}
}
setText(workingText);
if (appendShowAll) {
// 必须使用append,不能在上面使用+连接,否则spannable会无效
append(SPAN_CLOSE);
setMovementMethod(LinkMovementMethod.getInstance());
}
invalidate();
post(this::requestLayout);
}
/**
* 设置展开状态时的文本
*/
@SuppressLint("SetTextI18n")
private void setExpandText(String text) {
if(SPAN_EXPAND == null){
initExpandEnd();
}
Layout layout1 = createWorkingLayout(text);
Layout layout2 = createWorkingLayout(text + TEXT_CLOSE);
// 展示全部原始内容时 如果 TEXT_CLOSE 需要换行才能显示完整,则直接将TEXT_CLOSE展示在下一行
if(layout2.getLineCount() > layout1.getLineCount()){
setText(originText + "\n");
}else{
setText(originText);
}
append(SPAN_EXPAND);
setMovementMethod(LinkMovementMethod.getInstance());
invalidate();
post(this::requestLayout);
}
/**
* 返回textview的显示区域的layout,该textview的layout并不会显示出来
* 只是用其宽度来比较要显示的文字是否过长。
*/
private Layout createWorkingLayout(String workingText) {
return new StaticLayout(workingText, getPaint(), initWidth - getPaddingLeft() - getPaddingRight(),
Layout.Alignment.ALIGN_NORMAL, getLineSpacingMultiplier(), getLineSpacingExtra(), false);
}
/**
* sdk>=16,可以通过xml进行配置,但16以下必须用该方法配置
*/
@Override
public void setMaxLines(int maxLines) {
this.mMaxLines = maxLines;
super.setMaxLines(maxLines);
}
/**
* @param originText 待显示的原文本;
* @param isClose 设置TextView的初始状态是否为收起;
* 设置文本时,需要调用该方法来代替setText。若直接使用setText方法设置文本,
* 该控件只会作为普通TextView显示。
*/
public void setText(String originText, boolean isClose) {
this.originText = originText;
this.isClose = isClose;
isWidthModify = true;
notifyRefreshView();
}
/**
* 修改设置后通知重绘,setText(String originText, Boolean isClose)方法不需要调用
*/
public void notifyRefreshView() {
if(isClose) {
ExpandTextView.super.setMaxLines(mMaxLines);
setCloseText(originText);
} else {
ExpandTextView.super.setMaxLines(Integer.MAX_VALUE);
setExpandText(originText);
}
}
/**
* @param colorId 展开和收起时,文本尾的Span文本的颜色;
* 设置展开和收起时文本尾的Span文本的颜色(若不以该方法设置,则默认为R.color.red)。
*/
public void setLabelTextColor(int colorId) {
SPAN_COLOR = colorId;
initExpandEnd();
initCloseEnd();
}
/**
* @param str 收起时,文本尾代表"展开"的Span文本内容;
* 设置文本尾的"展开"Span文本的内容(若不以该方法设置,则默认为"展开")。
*/
public void setExpandLabelText(String str) {
TEXT_EXPAND = str;
initExpandEnd();
}
/**
* @param str 展开时,文本尾代表"收起"的Span文本内容;
* 设置文本尾的"收起"Span文本的内容(若不以该方法设置,则默认为"收起")。
*/
public void setCLOSELabelText(String str) {
TEXT_CLOSE = str;
initCloseEnd();
}
/**
* 实现NoCopySpan的原因是,为了防止Span在onSaveInstanceState时被复制保存,导致内存泄漏
*/
public static class NoRefCopySpan extends ClickableSpan implements NoCopySpan {
@Override
public void onClick(@NonNull View widget) {
//等待子类继承
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
}
}
public void setOnExpandClickListener(ExpandClickListener listener){
this.l = listener;
}
interface ExpandClickListener{
void onClick(boolean isExpand);
}
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.util.AttributeSet
import com.yidian.nightmode.widget.YdTextView
class ExpandTextViewReal @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) :YdTextView(context, attrs, defStyle) {
}
\ No newline at end of file
package com.yidian.shenghuoquan.newscontent.widget
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import com.yidian.shenghuoquan.newscontent.R
import com.yidian.shenghuoquan.newscontent.audio.IAudioControl
import com.yidian.shenghuoquan.newscontent.audio.IAudioView
import java.lang.ref.WeakReference
class FloatAudioView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
FrameLayout(context, attrs) , IAudioView {
private var close: (() -> Unit)?=null
private val TAG = "FloatAudioView"
private lateinit var ivPower:ImageView
private lateinit var ivPrev:ImageView
private lateinit var ivNext:ImageView
private lateinit var ivPlay:ImageView
private lateinit var tvContent:TextView
private var audioControl:WeakReference<IAudioControl>?=null
init {
inflate(context, R.layout.float_audio_layout,this)
initView()
initListener()
}
private fun initListener() {
ivPower.setOnClickListener {
Log.e(TAG, "initListener: ivPower ==" )
visibility = View.GONE
audioControl?.get()?.release()
close?.invoke()
}
ivPrev.setOnClickListener {
Log.e(TAG, "initListener: iv ivPrev" )
audioControl?.get()?.previous()
}
ivNext.setOnClickListener {
Log.e(TAG, "initListener: iv next" )
audioControl?.get()?.next()
}
ivPlay.setOnClickListener {
Log.e(TAG, "initListener: iv play" )
if (audioControl?.get()?.isPlaying() ==true){
audioControl?.get()?.pause()
updatePlayUi(false)
}else{
audioControl?.get()?.start()
updatePlayUi(true)
}
}
}
private fun initView() {
ivPower = findViewById(R.id.iv_power)
ivPlay = findViewById(R.id.iv_audio_play)
ivPrev = findViewById(R.id.iv_prev)
ivNext = findViewById(R.id.iv_next)
tvContent = findViewById(R.id.tv_content)
}
override fun bindAudioControl(control: IAudioControl) {
audioControl = WeakReference(control)
}
override fun setPrevEnable(enable: Boolean) {
ivPrev.isEnabled = enable
if (enable){
ivPrev.setImageResource(R.drawable.skip_previous)
}else{
ivPrev.setImageResource(R.drawable.skip_previous_gray)
}
}
override fun setPlayEnable(enable: Boolean) {
ivPlay.isEnabled = enable
}
override fun setNextEnable(enable:Boolean){
ivNext.isEnabled = enable
if (enable){
ivNext.setImageResource(R.drawable.skip_next)
}else{
ivNext.setImageResource(R.drawable.skip_next_gray)
}
}
override fun setContent(content: String) {
if (::tvContent.isInitialized){
tvContent.text = content
}
}
override fun updatePlayUi(isPlay: Boolean) {
ivPlay.setImageResource(if (isPlay)R.drawable.audio_start else R.drawable.audio_pause)
}
fun setOnCloseListener(close:()->Unit){
this.close = close
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
audioControl?.clear()
audioControl=null
}
}
\ No newline at end of file
...@@ -3,47 +3,6 @@ ...@@ -3,47 +3,6 @@
package="com.yidian.shenghuoquan.newscontent"> package="com.yidian.shenghuoquan.newscontent">
<application> <application>
<activity
android:name="com.yidian.shenghuoquan.broot.ui.FlashActivity"
android:theme="@style/FlashTheme">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".ui.MainActivity"
android:launchMode="singleTask" />
<activity android:name=".ui.DeepLinkActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="link_news"
android:scheme="ydsubway" />
</intent-filter>
</activity>
<activity
android:name=".ui.NewsContentActivity"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode" />
<service
android:name=".audio.AudioService"
android:enabled="true"
android:exported="true" />
<activity
android:name=".ui.alive.AliveTestActivity"
android:theme="@style/Transparent" />
<activity
android:name=".ui.idcard.IDCardTestActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountEnterpriseAuthCompleteActivity" android:name=".ui.auth.LifeAccountEnterpriseAuthCompleteActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
...@@ -53,60 +12,38 @@ ...@@ -53,60 +12,38 @@
<activity <activity
android:name=".ui.auth.LifeAccountCreateCompleteActivity" android:name=".ui.auth.LifeAccountCreateCompleteActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.idcard.IDCardResultActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.ProtocolActivity" android:name=".ui.ProtocolActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.ProductSupportActivity"
android:theme="@style/Transparent" />
<activity android:name=".ui.LoginLifeCircleActivity" /> <activity android:name=".ui.LoginLifeCircleActivity" />
<activity <activity
android:name=".ui.store.StoreManagementActivity" android:name=".ui.store.StoreManagementActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.EditStoreActivity" android:name=".ui.store.EditStoreActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.SelectAddressActivity" android:name=".ui.store.SelectAddressActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.store.SearchAddActivity" android:name=".ui.store.SearchAddActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountIdentityActivity" android:name=".ui.auth.LifeAccountIdentityActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountAuthActivity" android:name=".ui.auth.LifeAccountAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity
android:name=".ui.LifeAccountEnterpriseCertificationActivity"
android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountCreateActivity" android:name=".ui.auth.LifeAccountCreateActivity"
android:theme="@style/Transparent" android:theme="@style/Transparent"
android:windowSoftInputMode="stateHidden|adjustResize" /> android:windowSoftInputMode="stateHidden|adjustResize" />
<activity <activity
android:name=".ui.auth.LifeAccountPersonalAuthActivity" android:name=".ui.auth.LifeAccountPersonalAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.auth.LifeAccountEnterpriseAuthActivity" android:name=".ui.auth.LifeAccountEnterpriseAuthActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".personnel.ui.MyStaffActivity" android:name=".personnel.ui.MyStaffActivity"
android:launchMode="singleTask" android:launchMode="singleTask"
...@@ -129,20 +66,16 @@ ...@@ -129,20 +66,16 @@
<activity <activity
android:name=".ui.setting.SystemSettingActivity" android:name=".ui.setting.SystemSettingActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.MerchantCenterActivity" android:name=".ui.center.MerchantCenterActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.MerchantInfoActivity" android:name=".ui.center.MerchantInfoActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
<activity <activity
android:name=".ui.center.LifeAccountModifyNameActivity" android:name=".ui.center.LifeAccountModifyNameActivity"
android:theme="@style/Transparent" android:theme="@style/Transparent"
android:windowSoftInputMode="stateVisible" /> android:windowSoftInputMode="stateVisible" />
<activity <activity
android:name=".ui.center.MerchantAuthInfoActivity" android:name=".ui.center.MerchantAuthInfoActivity"
android:theme="@style/Transparent" /> android:theme="@style/Transparent" />
......
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