Commit 4198c514 authored by jyx's avatar jyx

代码优化

parent 4b851896
......@@ -36,6 +36,8 @@ android {
}
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
......@@ -175,8 +177,6 @@ dependencies {
// 工具类
// gson
// implementation files('libs/gson-2.3.1.jar')
implementation 'com.google.code.gson:gson:2.8.1'
// BASE64Decoder
// implementation files('libs/sun.misc.BASE64Decoder.jar')
......@@ -254,8 +254,6 @@ dependencies {
implementation 'com.just.agentweb:agentweb:4.1.2'
// 喜马拉雅 已集成
// testImplementation 'junit:junit:4.13'
// androidTestImplementation 'androidx.test.ext:junit:1.1.2'
// androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
......
......@@ -22,6 +22,8 @@
android:name="com.mints.goodmoney.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="com.mints.goodmoney.permission.JPUSH_MESSAGE" />
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT" />
......@@ -49,6 +51,14 @@
android:name="org.apache.http.legacy"
android:required="false" />
<meta-data
android:name="app_key"
android:value="ff71a11162f20808f9f349452dd9e141" />
<meta-data
android:name="pack_id"
android:value="com.mints.goodmoney" />
<!-- 适配小米(xiaomi)刘海屏 -->
<meta-data
android:name="android.max_aspect"
......@@ -197,10 +207,8 @@
android:name=".ui.activitys.XmlyAwardActivity"
android:screenOrientation="portrait" />
<activity
android:name=".ui.activitys.XmlyActivity"
android:screenOrientation="portrait">
</activity>
android:name=".ui.activitys.XmlyPlayActivity"
android:screenOrientation="portrait" />
<service
android:name=".service.UpdateService"
......@@ -217,7 +225,6 @@
android:exported="true"
android:process=":player" />
<!-- JPUSH 用户自定义的广播接收器 -->
<receiver
android:name="com.mints.goodmoney.service.JpushReceiver"
......
......@@ -79,15 +79,6 @@ class InitAppService : IntentService("InitializeService") {
// 变现猫
initBxm(this.application)
// // 喜马拉雅
// val mXimalaya = CommonRequest.getInstanse()
// val mAppSecret = "db3cb9e3ec5943f4987e78ddc5aec728"
// val mAppKey = "ff71a11162f20808f9f349452dd9e141"
// mXimalaya.setAppkey(mAppKey)
// mXimalaya.setPackid("com.mints.goodmoney")
// mXimalaya.init(this, mAppSecret)
// ConstantsOpenSdk.isDebug = true
}
/**
......
......@@ -8,7 +8,6 @@ import android.text.TextUtils;
import android.webkit.WebView;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.multidex.MultiDex;
import androidx.multidex.MultiDexApplication;
import com.bun.miitmdid.core.JLibrary;
......@@ -30,6 +29,7 @@ import com.ximalaya.ting.android.opensdk.constants.ConstantsOpenSdk;
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest;
import com.ximalaya.ting.android.opensdk.player.service.XmPlayerConfig;
import com.ximalaya.ting.android.opensdk.util.BaseUtil;
import com.ximalaya.ting.android.player.XMediaPlayerConstants;
import java.util.concurrent.Executors;
......@@ -62,6 +62,22 @@ public class MintsApplication extends MultiDexApplication {
// 判断应用是否在前台
ForegroundOrBackground.init(this);
ConstantsOpenSdk.isDebug = true;
XMediaPlayerConstants.isDebug = true;
XmPlayerConfig.getInstance(this).setDefualtNotificationNickNameAndInfo("开心麻花", "开心开心,无敌开心");
if (BaseUtil.isMainProcess(this)) {
// 喜马拉雅
CommonRequest instanse = CommonRequest.getInstanse();
String mAppSecret = "db3cb9e3ec5943f4987e78ddc5aec728";
String mAppKey = "ff71a11162f20808f9f349452dd9e141";
instanse.setAppkey(mAppKey);
instanse.setAppsecret(mAppSecret);
instanse.setPackid("com.mints.goodmoney");
instanse.setUseHttps(false);
instanse.init(this, mAppSecret);
}
// 三方配置
thirdConfig();
}
......@@ -145,7 +161,7 @@ public class MintsApplication extends MultiDexApplication {
RsNewsManager.INSTANCE.initX5Environment(this);
// 喜马拉雅
initXmly();
// initXmly();
}
private void initXmly() {
......
package com.mints.goodmoney.ui.activitys
import android.util.Log
import android.view.View
import android.widget.Toast
import com.fly.scenemodule.util.GsonUtils
import com.mints.goodmoney.R
import com.mints.goodmoney.ui.activitys.base.BaseActivity
import com.mints.goodmoney.utils.LogUtil
import com.ximalaya.ting.android.opensdk.constants.DTransferConstants
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack
import com.ximalaya.ting.android.opensdk.model.PlayableModel
import com.ximalaya.ting.android.opensdk.model.advertis.Advertis
import com.ximalaya.ting.android.opensdk.model.advertis.AdvertisList
import com.ximalaya.ting.android.opensdk.model.album.AlbumList
import com.ximalaya.ting.android.opensdk.model.category.CategoryList
import com.ximalaya.ting.android.opensdk.model.live.radio.Radio
import com.ximalaya.ting.android.opensdk.model.live.schedule.Schedule
import com.ximalaya.ting.android.opensdk.model.track.Track
import com.ximalaya.ting.android.opensdk.model.track.TrackList
import com.ximalaya.ting.android.opensdk.player.XmPlayerManager
import com.ximalaya.ting.android.opensdk.player.advertis.IXmAdsStatusListener
import com.ximalaya.ting.android.opensdk.player.appnotification.XmNotificationCreater
import com.ximalaya.ting.android.opensdk.player.service.IXmPlayerStatusListener
import com.ximalaya.ting.android.opensdk.player.service.XmPlayListControl
import com.ximalaya.ting.android.opensdk.player.service.XmPlayerException
import kotlinx.android.synthetic.main.activity_xmly_test.*
import kotlinx.android.synthetic.main.header_layout.*
/**
* 描述:关于我们
* 作者:孟崔广
* 时间:2020/9/23 18:39
*/
class XmlyActivity : BaseActivity(), View.OnClickListener {
private val TAG = XmlyActivity::class.java.simpleName
private val json = "{\"album_id\":4519297,\"album_intro\":\"最全最快最省时,热点新闻早知道\",\"album_title\":\"新闻早餐\",\"can_download\":true,\"category_id\":1,\"cover_url_large\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmobile_large\\u0026magick\\u003dpng\",\"cover_url_middle\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmedium\\u0026magick\\u003dpng\",\"cover_url_small\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmobile_small\\u0026magick\\u003dpng\",\"current_page\":1,\"params\":{\"count\":\"110\",\"total_page\":\"16\",\"album_id\":\"4519297\",\"page\":\"1\",\"track_base_url\":\"http://api.ximalaya.com/openapi-gateway-app/albums/browse\"},\"total_count\":1690,\"total_page\":16,\"tracks\":[{\"subordinated_album\":{\"id\":4519297,\"album_title\":\"新闻早餐\",\"cover_url_large\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmobile_large\\u0026magick\\u003dpng\",\"cover_url_middle\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmedium\\u0026magick\\u003dpng\",\"cover_url_small\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d5\\u0026upload_type\\u003dalbum\\u0026device_type\\u003dios\\u0026name\\u003dmobile_small\\u0026magick\\u003dpng\",\"serializeStatus\":0,\"uptoDateTime\":0},\"announcer\":{\"anchorGrade\":0,\"id\":52622741,\"avatar_url\":\"https://imgopen.xmcdn.com/group20/M05/19/EA/wKgJJ1eDW1_QCA5MAABNXnIlT3I433.png!op_type\\u003d3\\u0026columns\\u003d110\\u0026rows\\u003d110\",\"follower_count\":0,\"following_count\":0,\"kind\":\"user\",\"nickname\":\"东方网\",\"released_album_count\":0,\"released_track_count\":0,\"vcategory_id\":0,\"is_verified\":true,\"verifyType\":0},\"authorized\":false,\"blockIndex\":0,\"blockNum\":0,\"business_type\":0,\"can_download\":true,\"category_id\":1,\"channelId\":0,\"chargeFileSize\":0,\"comment_count\":50,\"cover_url_large\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d3\\u0026columns\\u003d640\\u0026rows\\u003d640\",\"cover_url_middle\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d3\\u0026columns\\u003d180\\u0026rows\\u003d180\",\"cover_url_small\":\"https://imgopen.xmcdn.com/group18/M01/19/DE/wKgJKleDXj2QJYOuAAFbNixU8BI237.png!op_type\\u003d3\\u0026columns\\u003d100\\u0026rows\\u003d100\",\"created_at\":1608589201000,\"discountedPrice\":0.0,\"download_count\":0,\"downloadCreated\":0,\"download_size\":1556152,\"downloadStatus\":-2,\"downloadTime\":0,\"download_url\":\"https://aod.cos.tx.xmcdn.com/storages/bd75-audiofreehighqps/CA/1F/CMCoOR8DtpvoABe-uABzoyHy.m4a\",\"downloadedSize\":0,\"duration\":501,\"extraa\":false,\"favorite_count\":215,\"is_free\":false,\"hasCopyRight\":true,\"has_sample\":false,\"insertSequence\":0,\"isAutoPaused\":false,\"isChecked\":false,\"isLike\":false,\"is_paid\":false,\"is_trailer\":false,\"isVideo\":false,\"liveRoomId\":0,\"order_num\":0,\"orderPositionInAlbum\":0,\"orderPositon\":-1,\"play_count\":154050,\"play_size_24_m4a\":\"1556152\",\"play_size_32\":2441525,\"play_size_64\":4451177,\"play_size_64_m4a\":\"4069015\",\"play_size_amr\":452166,\"play_source\":0,\"play_url_24_m4a\":\"\",\"play_url_32\":\"\",\"play_url_64\":\"\",\"play_url_64_m4a\":\"\",\"play_url_amr\":\"\",\"price\":0.0,\"priceTypeEnum\":0,\"priceTypeId\":0,\"programId\":0,\"protocolVersion\":0,\"radioId\":0,\"sample_duration\":0,\"scheduleId\":0,\"source\":1,\"templateId\":0,\"timeline\":0,\"topic_id\":0,\"trackActivityId\":0,\"track_intro\":\"\",\"trackStatus\":-1,\"track_tags\":\"\",\"track_title\":\"港媒:被通缉的罗冠聪宣称决定向英国政府申请“政治庇护” | 新闻早餐 2020.12.22\",\"type\":0,\"uid\":0,\"updateStatus\":false,\"updated_at\":1608589201000,\"vip_first_status\":\"0\",\"id\":367441649,\"isWeikeTrack\":false,\"kind\":\"track\",\"lastPlayedMills\":-1,\"weikeLessonId\":0,\"weikeRoomId\":0}]}"
private var mCategoryList: CategoryList? = null
private var mTrackList: TrackList? = null
private lateinit var mPlayerManager: XmPlayerManager
override fun getContentViewLayoutID() = R.layout.activity_xmly_test
override fun isApplyKitKatTranslucency() = false
override fun initViewsAndEvents() {
tv_title.text = "喜马拉雅测试"
iv_left_icon.visibility = View.VISIBLE
iv_left_icon.setImageResource(R.mipmap.ic_arrow_back)
mPlayerManager = XmPlayerManager.getInstance(this)
val mNotification = XmNotificationCreater.getInstanse(this).initNotification(this.applicationContext, XmlyActivity::class.java)
// 如果之前贵方使用了 `XmPlayerManager.init(int id, Notification notification)` 这个初始化的方式
// 请参考`4.8 播放器通知栏使用`重新添加新的通知栏布局,否则直接升级可能导致在部分手机播放时崩溃
// 如果不想使用sdk内部搞好的notification,或者想自建notification 可以使用下面的 init()函数进行初始化
mPlayerManager.init(System.currentTimeMillis().toInt(), mNotification)
// mPlayerManager.addPlayerStatusListener(mPlayerStatusListener)
// mPlayerManager.addAdsStatusListener(mAdsListener)
mPlayerManager.addOnConnectedListerner(object : XmPlayerManager.IConnectListener {
override fun onConnected() {
mPlayerManager.removeOnConnectedListerner(this)
mPlayerManager.setPlayMode(XmPlayListControl.PlayMode.PLAY_MODEL_LIST_LOOP)
Toast.makeText(this@XmlyActivity, "播放器初始化成功", Toast.LENGTH_SHORT).show()
}
})
initListener()
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.iv_left_icon -> finish()
R.id.btn1 -> {
val vo = hashMapOf<String, String>()
CommonRequest.getCategories(vo, object : IDataCallBack<CategoryList> {
override fun onSuccess(p0: CategoryList?) {
mCategoryList = p0
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
}
})
}
R.id.btn2 -> {
val vo = hashMapOf<String, String>()
vo[DTransferConstants.CATEGORY_ID] = "12"
vo[DTransferConstants.CALC_DIMENSION] = "1"
vo[DTransferConstants.PAGE] = "1"
vo["count"] = "10"
CommonRequest.getAlbumList(vo, object : IDataCallBack<AlbumList> {
override fun onSuccess(p0: AlbumList?) {
val toJson = GsonUtils.toJson(p0)
LogUtil.d(toJson)
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
}
})
}
R.id.btn3 -> {
val vo = hashMapOf<String, String>()
// vo[DTransferConstants.ALBUM_ID] = "4519297"
// vo[DTransferConstants.SORT] = "asc"
// vo[DTransferConstants.PAGE] = "1"
// vo["count"] = "200"
vo[DTransferConstants.ALBUM_ID] = "4519297"
vo[DTransferConstants.PAGE] = "1"
vo[DTransferConstants.PAGE_SIZE] = "200"
CommonRequest.getTracks(vo, object : IDataCallBack<TrackList> {
override fun onSuccess(p0: TrackList?) {
//// val toJson = GsonUtils.toJson(p0)
// val fromJson = GsonUtils.fromJson<TrackList>(json, TrackList::class.java)
// mTrackList = fromJson
//// LogUtil.d(toJson)
if (p0 != null && p0.getTracks() != null &&p0.getTracks().size != 0) {
if (mTrackList == null) {
mTrackList = p0
} else {
mTrackList?.getTracks()?.addAll(p0.getTracks())
}
}
println("MainFragmentActivity.mTrackList === $mTrackList")
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
}
})
}
R.id.btn4 -> {
mTrackList?.let {
mPlayerManager.playList(it.tracks, 0)
val playList = XmPlayerManager.getInstance(this).playList
LogUtil.d("MainFragmentActivity.onOptionsItemSelected === $playList")
}
}
R.id.btn5 -> {
// val track = Track()
//
// track.kind = PlayableModel.KIND_TRACK
// track.downloadedSaveFilePath = Environment.getExternalStorageDirectory().absolutePath + File.separator + "a.mp3"
// LogUtil.d("AAAAAAAAAA" + track.downloadedSaveFilePath)
// track.trackTitle = "a.mp3"
// track.dataId = (-1 * track.trackTitle.hashCode()).toLong()
// val tarcks = arrayListOf<Track>()
// tarcks.add(track)
if(mTrackList!=null&&mTrackList!!.tracks!=null){
mPlayerManager.playList(mTrackList!!.tracks, 1)
}
// val playList = XmPlayerManager.getInstance(mContext).playList
// println("MainFragmentActivity.onOptionsItemSelected === $playList")
}
}
}
private val mAdsListener: IXmAdsStatusListener = object : IXmAdsStatusListener {
override fun onStartPlayAds(ad: Advertis, position: Int) {
Log.i(TAG, "onStartPlayAds, Ad:" + ad.name + ", pos:" + position)
// if (ad != null) {
// x.image().bind(mSoundCover ,ad.getImageUrl());
// }
// mBtnPlay.setEnabled(true)
// mBtnPlay.setImageResource(R.drawable.widget_pause_normal)
}
override fun onStartGetAdsInfo() {
Log.i(TAG, "onStartGetAdsInfo")
// mBtnPlay.setEnabled(false)
// mSeekBar.setEnabled(false)
}
override fun onGetAdsInfo(ads: AdvertisList) {
Log.i(TAG, "onError what:${ads.msg}, extra:${ads.msg}")
}
override fun onError(what: Int, extra: Int) {
Log.i(TAG, "onError what:$what, extra:$extra")
}
override fun onCompletePlayAds() {
Log.i(TAG, "onCompletePlayAds")
// mBtnPlay.setEnabled(true)
// mSeekBar.setEnabled(true)
// val model = mPlayerManager.currSound
// if (model != null && model is Track) {
// x.image().bind(mSoundCover, model.coverUrlLarge)
// }
}
override fun onAdsStopBuffering() {
Log.i(TAG, "onAdsStopBuffering")
}
override fun onAdsStartBuffering() {
Log.i(TAG, "onAdsStartBuffering")
}
}
private val mPlayerStatusListener: IXmPlayerStatusListener = object : IXmPlayerStatusListener {
override fun onSoundPrepared() {
Log.i(TAG, "onSoundPrepared")
// mSeekBar.setEnabled(true)
// mProgress.setVisibility(View.GONE)
}
override fun onSoundSwitch(laModel: PlayableModel?, curModel: PlayableModel?) {
Log.i(TAG, "onSoundSwitch index:$curModel")
// val model = mPlayerManager.currSound
// if (model != null) {
// var title: String? = null
// var coverUrl: String? = null
// if (model is Track) {
// val info = model
// title = info.trackTitle
// coverUrl = info.coverUrlLarge
// } else if (model is Schedule) {
// val program = model
// title = program.relatedProgram.programName
// coverUrl = program.relatedProgram.backPicUrl
// } else if (model is Radio) {
// val radio = model
// title = radio.radioName
// coverUrl = radio.coverUrlLarge
// }
// mTextView.setText(title)
// x.image().bind(mSoundCover, coverUrl)
// }
// updateButtonStatus()
}
private fun updateButtonStatus() {
// if (mPlayerManager.hasPreSound()) {
// mBtnPreSound.setEnabled(true)
// } else {
// mBtnPreSound.setEnabled(false)
// }
// if (mPlayerManager.hasNextSound()) {
// mBtnNextSound.setEnabled(true)
// } else {
// mBtnNextSound.setEnabled(false)
// }
}
override fun onPlayStop() {
Log.i(TAG, "onPlayStop")
// mBtnPlay.setImageResource(R.drawable.widget_play_normal)
}
override fun onPlayStart() {
Log.i(TAG, "onPlayStart")
// mBtnPlay.setImageResource(R.drawable.widget_pause_normal)
}
override fun onPlayProgress(currPos: Int, duration: Int) {
var title: String? = ""
val info = mPlayerManager.currSound
if (info != null) {
if (info is Track) {
title = info.trackTitle
} else if (info is Schedule) {
title = info.relatedProgram.programName
} else if (info is Radio) {
title = info.radioName
}
}
// mTextView.setText(title)
// mTime.setText("[" + ToolUtil.formatTime(currPos).toString() + "/" + ToolUtil.formatTime(duration).toString() + "]")
// if (mUpdateProgress && duration != 0) {
// mSeekBar.setProgress((100 * currPos / duration.toFloat()).toInt())
// }
// if (info is Track) {
// println("MainFragmentActivity.onPlayProgress " + currPos + " " + duration + " " + info.duration)
// }
}
override fun onPlayPause() {
Log.i(TAG, "onPlayPause")
// mBtnPlay.setImageResource(R.drawable.widget_play_normal)
}
override fun onSoundPlayComplete() {
Log.i(TAG, "onSoundPlayComplete")
// Toast.makeText(this@MainFragmentActivity, "播放完成", Toast.LENGTH_SHORT).show()
// mBtnPlay.setImageResource(R.drawable.widget_play_normal)
}
override fun onError(exception: XmPlayerException): Boolean {
Log.i(TAG, "XmPlayerException = onError " + exception.message + " " + XmPlayerManager.getInstance(this@XmlyActivity).isPlaying)
// println("MainFragmentActivity.onError $exception")
// mBtnPlay.setImageResource(R.drawable.widget_play_normal)
// if (!NetworkType.isConnectTONetWork(mContext)) {
// Toast.makeText(this@MainFragmentActivity, "没有网络导致停止播放", Toast.LENGTH_SHORT).show()
// }
return false
}
override fun onBufferProgress(position: Int) {
// mSeekBar.setSecondaryProgress(position)
// println("MainFragmentActivity.onBufferProgress $position")
}
override fun onBufferingStart() {
Log.i(TAG, "onBufferingStart " + XmPlayerManager.getInstance(this@XmlyActivity).isPlaying)
// mSeekBar.setEnabled(false)
// mProgress.setVisibility(View.VISIBLE)
}
override fun onBufferingStop() {
Log.i(TAG, "onBufferingStop")
// mSeekBar.setEnabled(true)
// mProgress.setVisibility(View.GONE)
}
}
override fun onDestroy() {
if (mPlayerManager != null) {
mPlayerManager.removePlayerStatusListener(mPlayerStatusListener)
}
XmPlayerManager.release()
CommonRequest.release()
super.onDestroy()
}
private fun initListener() {
iv_left_icon.setOnClickListener(this)
btn1.setOnClickListener(this)
btn2.setOnClickListener(this)
btn3.setOnClickListener(this)
btn4.setOnClickListener(this)
btn5.setOnClickListener(this)
}
}
package com.mints.goodmoney.ui.activitys
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import com.mints.goodmoney.R
import com.mints.goodmoney.ui.activitys.base.BaseActivity
import com.mints.goodmoney.ui.adapter.XmlyPlayAdapter
import com.mints.goodmoney.utils.LogUtil
import com.mints.goodmoney.utils.ToolUtil
import com.mints.library.utils.GlideUtils
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
import com.ximalaya.ting.android.opensdk.constants.DTransferConstants
import com.ximalaya.ting.android.opensdk.datatrasfer.CommonRequest
import com.ximalaya.ting.android.opensdk.datatrasfer.IDataCallBack
import com.ximalaya.ting.android.opensdk.model.PlayableModel
import com.ximalaya.ting.android.opensdk.model.advertis.Advertis
import com.ximalaya.ting.android.opensdk.model.advertis.AdvertisList
import com.ximalaya.ting.android.opensdk.model.live.radio.Radio
import com.ximalaya.ting.android.opensdk.model.live.schedule.Schedule
import com.ximalaya.ting.android.opensdk.model.track.Track
import com.ximalaya.ting.android.opensdk.model.track.TrackList
import com.ximalaya.ting.android.opensdk.player.XmPlayerManager
import com.ximalaya.ting.android.opensdk.player.XmPlayerManager.*
import com.ximalaya.ting.android.opensdk.player.advertis.IXmAdsStatusListener
import com.ximalaya.ting.android.opensdk.player.appnotification.XmNotificationCreater
import com.ximalaya.ting.android.opensdk.player.service.IXmPlayerStatusListener
import com.ximalaya.ting.android.opensdk.player.service.XmPlayListControl
import com.ximalaya.ting.android.opensdk.player.service.XmPlayerException
import com.ximalaya.ting.android.opensdk.util.NetworkType
import kotlinx.android.synthetic.main.activity_xmly_play.*
import kotlinx.android.synthetic.main.header_layout.*
/**
* 描述:关于我们
* 作者:孟崔广
* 时间:2020/9/23 18:39
*/
class XmlyPlayActivity : BaseActivity(), View.OnClickListener, XmlyPlayAdapter.OnItemClickListener, OnRefreshListener, OnLoadMoreListener {
private val TAG = XmlyPlayActivity::class.java.simpleName
private lateinit var mPlayerManager: XmPlayerManager
override fun getContentViewLayoutID() = R.layout.activity_xmly_play
override fun isApplyKitKatTranslucency() = false
private val mUpdateProgress = true
private lateinit var xmlyPlayAdapter: XmlyPlayAdapter
private var xmlyData: MutableList<Track> = mutableListOf()
private var mAlbumList: TrackList? = null
private var mAlbumId = 0L
// 分页
private var xmlyPage = 1
private val PAGE_SIZE = 10
companion object {
const val ALBUM_ID = "album_id"
}
override fun getBundleExtras(extras: Bundle) {
mAlbumId = extras.getLong(ALBUM_ID)
}
override fun initViewsAndEvents() {
tv_title.text = "专辑列表"
iv_left_icon.visibility = View.VISIBLE
iv_left_icon.setImageResource(R.mipmap.ic_arrow_back)
initRecyView()
initListener()
showLoading("加载中...")
mPlayerManager = getInstance(this)
val mNotification = XmNotificationCreater.getInstanse(this).initNotification(this.applicationContext, XmlyPlayActivity::class.java)
mPlayerManager.init(System.currentTimeMillis().toInt(), mNotification)
mPlayerManager.addPlayerStatusListener(mPlayerStatusListener)
// mPlayerManager.addAdsStatusListener(mAdsListener)
mPlayerManager.addOnConnectedListerner(object : IConnectListener {
override fun onConnected() {
hideLoading()
mPlayerManager.removeOnConnectedListerner(this)
mPlayerManager.playMode = XmPlayListControl.PlayMode.PLAY_MODEL_LIST_LOOP
Toast.makeText(this@XmlyPlayActivity, "播放器初始化成功", Toast.LENGTH_SHORT).show()
}
})
loadData()
}
private fun loadData() {
val vo = hashMapOf<String, String>()
// 专辑id
vo[DTransferConstants.ALBUM_ID] = mAlbumId.toString()
// 1-最火 2-最新 3-最多播放
vo[DTransferConstants.PAGE] = xmlyPage.toString()
vo[DTransferConstants.PAGE_SIZE] = PAGE_SIZE.toString()
CommonRequest.getTracks(vo, object : IDataCallBack<TrackList> {
override fun onSuccess(p0: TrackList?) {
if (p0 != null && p0.tracks != null && p0.tracks.size != 0) {
runOnUiThread {
if (xmlyPage == 1) {
tv_title.text = p0.albumTitle
GlideUtils.loadImageView(this@XmlyPlayActivity, p0.coverUrlMiddle, sound_cover)
}
mAlbumList = p0
getDataSuc(p0.tracks)
}
} else {
getDataFail()
}
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
getDataFail()
}
})
}
override fun onRefresh(refreshLayout: RefreshLayout) {
xmlyPage = 1
xmlyData.clear()
loadData()
}
override fun onLoadMore(refreshLayout: RefreshLayout) {
xmlyPage = ++xmlyPage
loadData()
}
/**
* 获取数据失败
*/
private fun getDataFail() {
srl_xmly.finishRefresh(false)
srl_xmly.finishLoadMore(false)
xmlyPage = if (xmlyPage == 1) 1 else xmlyPage - 1
}
/**
* 获取数据成功
*/
private fun getDataSuc(list: List<Track>) {
if (::xmlyPlayAdapter.isInitialized) {
xmlyData.addAll(list)
if (xmlyPage == 1) {
srl_xmly.finishRefresh(true)
xmlyPlayAdapter.notifyDataSetChanged()
} else {
if (list.size < PAGE_SIZE) {
srl_xmly.finishLoadMoreWithNoMoreData()
} else {
srl_xmly.finishLoadMore()
}
xmlyPlayAdapter.notifyItemChanged(list.size)
}
}
}
private fun initRecyView() {
val linearLayoutManager = LinearLayoutManager(context)
xmlyPageVip.layoutManager = linearLayoutManager
xmlyPageVip.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
xmlyPlayAdapter = XmlyPlayAdapter(xmlyData)
xmlyPageVip.adapter = xmlyPlayAdapter
xmlyPlayAdapter.setOnItemClickListener(this)
}
private val mPlayerStatusListener: IXmPlayerStatusListener = object : IXmPlayerStatusListener {
override fun onSoundPrepared() {
Log.i(TAG, "onSoundPrepared")
seek_bar.setEnabled(true)
buffering_progress.setVisibility(View.GONE)
}
override fun onSoundSwitch(laModel: PlayableModel, curModel: PlayableModel) {
Log.i(TAG, "onSoundSwitch index:$curModel")
val model = mPlayerManager.currSound
if (model != null) {
var title: String? = null
var coverUrl: String? = null
if (model is Track) {
val info = model
title = info.trackTitle
coverUrl = info.coverUrlLarge
} else if (model is Schedule) {
val program = model
title = program.relatedProgram.programName
coverUrl = program.relatedProgram.backPicUrl
} else if (model is Radio) {
val radio = model
title = radio.radioName
coverUrl = radio.coverUrlLarge
}
message.setText(title)
GlideUtils.loadImageView(this@XmlyPlayActivity, coverUrl, sound_cover)
}
// updateButtonStatus()
}
private fun updateButtonStatus() {
if (mPlayerManager.hasPreSound()) {
pre_sound.setEnabled(true)
} else {
pre_sound.setEnabled(false)
}
if (mPlayerManager.hasNextSound()) {
next_sound.setEnabled(true)
} else {
next_sound.setEnabled(false)
}
}
override fun onPlayStop() {
Log.i(TAG, "onPlayStop")
play_or_pause.setImageResource(R.mipmap.widget_play_normal)
}
override fun onPlayStart() {
Log.i(TAG, "onPlayStart")
play_or_pause.setImageResource(R.mipmap.widget_pause_normal)
}
override fun onPlayProgress(currPos: Int, duration: Int) {
var title: String? = ""
val info = mPlayerManager.currSound
if (info != null) {
if (info is Track) {
title = info.trackTitle
} else if (info is Schedule) {
title = info.relatedProgram.programName
} else if (info is Radio) {
title = info.radioName
}
}
message.text = title
time.text = "[" + ToolUtil.formatTime(currPos.toLong()).toString() + "/" + ToolUtil.formatTime(duration.toLong()).toString() + "]"
if (mUpdateProgress && duration != 0) {
seek_bar.progress = (100 * currPos / duration.toFloat()).toInt()
}
if (info is Track) {
println("MainFragmentActivity.onPlayProgress " + currPos + " " + duration + " " + info.duration)
}
}
override fun onPlayPause() {
Log.i(TAG, "onPlayPause")
play_or_pause.setImageResource(R.mipmap.widget_play_normal)
}
override fun onSoundPlayComplete() {
Log.i(TAG, "onSoundPlayComplete")
Toast.makeText(this@XmlyPlayActivity, "播放完成", Toast.LENGTH_SHORT).show()
play_or_pause.setImageResource(R.mipmap.widget_play_normal)
}
override fun onError(exception: XmPlayerException): Boolean {
Log.i(TAG, "XmPlayerException = onError " + exception.message + " " + getInstance(this@XmlyPlayActivity).isPlaying)
println("MainFragmentActivity.onError $exception")
play_or_pause.setImageResource(R.mipmap.widget_play_normal)
if (!NetworkType.isConnectTONetWork(mContext)) {
Toast.makeText(this@XmlyPlayActivity, "没有网络导致停止播放", Toast.LENGTH_SHORT).show()
}
return false
}
override fun onBufferProgress(position: Int) {
seek_bar.setSecondaryProgress(position)
println("MainFragmentActivity.onBufferProgress $position")
}
override fun onBufferingStart() {
Log.i(TAG, "onBufferingStart " + getInstance(this@XmlyPlayActivity).isPlaying)
seek_bar.setEnabled(false)
buffering_progress.setVisibility(View.VISIBLE)
}
override fun onBufferingStop() {
Log.i(TAG, "onBufferingStop")
seek_bar.setEnabled(true)
buffering_progress.setVisibility(View.GONE)
}
}
private val mAdsListener: IXmAdsStatusListener = object : IXmAdsStatusListener {
override fun onStartPlayAds(ad: Advertis, position: Int) {
Log.i(TAG, "onStartPlayAds, Ad:" + ad.name + ", pos:" + position)
play_or_pause.setEnabled(true)
play_or_pause.setImageResource(R.mipmap.widget_pause_normal)
}
override fun onStartGetAdsInfo() {
Log.i(TAG, "onStartGetAdsInfo")
play_or_pause.setEnabled(false)
seek_bar.setEnabled(false)
}
override fun onGetAdsInfo(ads: AdvertisList) {}
override fun onError(what: Int, extra: Int) {
Log.i(TAG, "onError what:$what, extra:$extra")
}
override fun onCompletePlayAds() {
Log.i(TAG, "onCompletePlayAds")
play_or_pause.setEnabled(true)
seek_bar.setEnabled(true)
val model = mPlayerManager.currSound
if (model != null && model is Track) {
GlideUtils.loadImageView(this@XmlyPlayActivity, model.coverUrlMiddle, sound_cover)
}
}
override fun onAdsStopBuffering() {
Log.i(TAG, "onAdsStopBuffering")
}
override fun onAdsStartBuffering() {
Log.i(TAG, "onAdsStartBuffering")
}
}
override fun onClick(v: View?) {
when (v?.id) {
R.id.iv_left_icon -> finish()
R.id.play_or_pause -> {
// 播放或暂停
if (mPlayerManager.isPlaying) {
mPlayerManager.pause()
} else {
mPlayerManager.play()
}
}
R.id.next_sound -> {
// 下一首
mPlayerManager.playNext()
}
R.id.pre_sound -> {
// 上一首
mPlayerManager.playPre()
}
}
}
override fun onDestroy() {
if (::mPlayerManager.isInitialized) {
mPlayerManager.removePlayerStatusListener(mPlayerStatusListener)
}
release()
CommonRequest.release()
super.onDestroy()
}
private fun initListener() {
srl_xmly.setOnRefreshListener(this)
srl_xmly.setOnLoadMoreListener(this)
iv_left_icon.setOnClickListener(this)
play_or_pause.setOnClickListener(this)
next_sound.setOnClickListener(this)
pre_sound.setOnClickListener(this)
}
override fun onItemClick(position: Int) {
mPlayerManager.playList(mAlbumList!!.tracks, position)
}
}
......@@ -5,19 +5,19 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mints.goodmoney.R
import com.mints.library.utils.GlideUtils
import com.ximalaya.ting.android.opensdk.model.album.Album
class XmlyPageAdapter(val xmlyPageList: Any?) :
class XmlyPageAdapter(val xmlyPageList: MutableList<Album>) :
RecyclerView.Adapter<XmlyPageAdapter.ViewHolder>() {
lateinit var context: Context
lateinit var mOnItemClickListener: OnItemClickListener
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val ivXmlyPage: ImageView = view.findViewById(R.id.ivXmlyPage)
val tvXmlyPageContent: TextView = view.findViewById(R.id.tvXmlyPageContent)
......@@ -32,13 +32,19 @@ class XmlyPageAdapter(val xmlyPageList: Any?) :
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val album = xmlyPageList[position]
holder.tvXmlyPageContent.text = album.recommendReason
holder.tvXmlyPagecount.text = album.playCount.toString()
GlideUtils.loadImageView(holder.itemView.context, album.coverUrlMiddle, holder.ivXmlyPage)
holder.itemView.setOnClickListener {
mOnItemClickListener.onItemClick(position)
if (::mOnItemClickListener.isInitialized) {
mOnItemClickListener.onItemClick(position)
}
}
}
// override fun getItemCount() = xmlyPageList?.size
override fun getItemCount() = 15
override fun getItemCount() = xmlyPageList.size
interface OnItemClickListener {
fun onItemClick(position: Int)
......
package com.mints.goodmoney.ui.adapter
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.mints.goodmoney.R
import com.ximalaya.ting.android.opensdk.model.track.Track
class XmlyPlayAdapter(val xmlyPageList: MutableList<Track>) :
RecyclerView.Adapter<XmlyPlayAdapter.ViewHolder>() {
lateinit var context: Context
lateinit var mOnItemClickListener: OnItemClickListener
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val tvIndex: TextView = view.findViewById(R.id.tv_index)
val tvTitle: TextView = view.findViewById(R.id.tv_title)
val tvCount: TextView = view.findViewById(R.id.tv_count)
val tvFree: TextView = view.findViewById(R.id.tv_free)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
context = parent.context
val view = LayoutInflater.from(context).inflate(R.layout.item_rv_xmly_play, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val track = xmlyPageList[position]
holder.tvIndex.text = (position + 1).toString()
holder.tvTitle.text = track.trackTitle
holder.tvCount.text = track.playCount.toString()
holder.tvFree.text = track.isFree.toString()
holder.itemView.setOnClickListener {
if (::mOnItemClickListener.isInitialized) {
mOnItemClickListener.onItemClick(position)
}
}
}
override fun getItemCount() = xmlyPageList.size
interface OnItemClickListener {
fun onItemClick(position: Int)
}
fun setOnItemClickListener(listener: OnItemClickListener) {
mOnItemClickListener = listener
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.mints.goodmoney.ui.fragment
import androidx.fragment.app.Fragment
import androidx.viewpager.widget.ViewPager
import com.fly.scenemodule.util.GsonUtils
import com.mints.goodmoney.R
import com.mints.goodmoney.common.AppConfig
import com.mints.goodmoney.common.Constant
......@@ -22,6 +23,8 @@ class XmlyFragment : LazyLoadBaseFragment() {
// 听书分类数据
private var mCategoryList: CategoryList? = null
private var mCurrentIndex = 0
override fun getContentViewLayoutID() = R.layout.fragment_main_xmly
override fun initViewsAndEvents() {
......@@ -30,9 +33,9 @@ class XmlyFragment : LazyLoadBaseFragment() {
override fun onFragmentFirstVisible() {
super.onFragmentFirstVisible()
showLoading("加载中...")
// 获取tab
initView()
loadData()
}
private fun loadData() {
......@@ -40,11 +43,15 @@ class XmlyFragment : LazyLoadBaseFragment() {
val vo = hashMapOf<String, String>()
CommonRequest.getCategories(vo, object : IDataCallBack<CategoryList> {
override fun onSuccess(p0: CategoryList?) {
hideLoading()
mCategoryList = p0
initView()
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
hideLoading()
}
})
......@@ -58,19 +65,22 @@ class XmlyFragment : LazyLoadBaseFragment() {
}
private fun initView() {
val tabs: MutableList<String> = ArrayList()
val fragments: MutableList<Fragment> = ArrayList()
for (i in 1..10) {
tabs.add("视频" + i)
fragments.add(XmlyPageFragment(i))
mCategoryList?.let {
val tabs: MutableList<String> = ArrayList()
val fragments: MutableList<Fragment> = ArrayList()
for (i in 0 until it.categories.size) {
tabs.add(it.categories[i].categoryName)
fragments.add(XmlyPageFragment(it.categories[i].id))
}
//去除两侧应阴影
xtFragmentXmly.overScrollMode = ViewPager.OVER_SCROLL_NEVER
vpFragmentXmly.offscreenPageLimit = tabs.size + 3
val adapter = MessageFragAdapter(childFragmentManager, fragments, tabs)
vpFragmentXmly.adapter = adapter
xtFragmentXmly.setxTabDisplayNum(tabs.size)
xtFragmentXmly.setupWithViewPager(vpFragmentXmly)
}
//去除两侧应阴影
xtFragmentXmly.overScrollMode = ViewPager.OVER_SCROLL_NEVER
vpFragmentXmly.offscreenPageLimit = tabs.size + 3
val adapter = MessageFragAdapter(childFragmentManager, fragments, tabs)
vpFragmentXmly.adapter = adapter
xtFragmentXmly.setxTabDisplayNum(tabs.size)
xtFragmentXmly.setupWithViewPager(vpFragmentXmly)
}
}
\ No newline at end of file
package com.mints.goodmoney.ui.fragment
import android.os.Bundle
import androidx.recyclerview.widget.GridLayoutManager
import com.fly.scenemodule.util.GsonUtils
import com.mints.goodmoney.R
import com.mints.goodmoney.common.Constant
import com.mints.goodmoney.ui.activitys.AwardActivity
import com.mints.goodmoney.ui.activitys.XmlyPlayActivity
import com.mints.goodmoney.ui.adapter.XmlyPageAdapter
import com.mints.goodmoney.ui.fragment.base.LazyLoadBaseFragment
import com.mints.goodmoney.utils.LogUtil
......@@ -13,31 +17,29 @@ import com.ximalaya.ting.android.opensdk.model.album.AlbumList
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener
import com.scwang.smartrefresh.layout.listener.OnRefreshListener
import com.ximalaya.ting.android.opensdk.model.album.Album
import kotlinx.android.synthetic.main.fragment_main_xmly_page.*
/**
* 描述:喜马拉雅封面
* 作者:孟崔广
*/
class XmlyPageFragment(private val categoryId: Int) : LazyLoadBaseFragment(),
class XmlyPageFragment(private val categoryId: Long) : LazyLoadBaseFragment(),
XmlyPageAdapter.OnItemClickListener,
OnRefreshListener,
OnLoadMoreListener {
private lateinit var xmlyPageAdapter: XmlyPageAdapter
private var xmlyData: MutableList<Any> = mutableListOf()
private var xmlyData: MutableList<Album> = mutableListOf()
// 分页
private var xmlyPage = 1
private val PAGE_SIZE = 15
private var mAlbumList: AlbumList? = null
private var mPage = 1
private var mCount = 10
private val PAGE_SIZE = 10
override fun getContentViewLayoutID() = R.layout.fragment_main_xmly_page
override fun initViewsAndEvents() {
loadData()
}
private fun loadData() {
......@@ -46,15 +48,23 @@ class XmlyPageFragment(private val categoryId: Int) : LazyLoadBaseFragment(),
vo[DTransferConstants.CATEGORY_ID] = categoryId.toString()
// 1-最火 2-最新 3-最多播放
vo[DTransferConstants.CALC_DIMENSION] = "1"
vo[DTransferConstants.PAGE] = mPage.toString()
vo["count"] = mCount.toString()
vo[DTransferConstants.PAGE] = xmlyPage.toString()
vo[DTransferConstants.PAGE_SIZE] = PAGE_SIZE.toString()
CommonRequest.getAlbumList(vo, object : IDataCallBack<AlbumList> {
override fun onSuccess(p0: AlbumList?) {
mAlbumList = p0
if (p0 != null && p0.albums != null && p0.albums.size != 0) {
activity?.runOnUiThread {
getDataSuc(p0.albums)
}
} else {
getDataFail()
}
}
override fun onError(p0: Int, p1: String?) {
LogUtil.e(p1)
getDataFail()
}
})
......@@ -68,23 +78,26 @@ class XmlyPageFragment(private val categoryId: Int) : LazyLoadBaseFragment(),
}
override fun onItemClick(position: Int) {
showToast("界面:视频 item:${position}")
val bundle = Bundle()
bundle.putLong(XmlyPlayActivity.ALBUM_ID, xmlyData[position].id)
readyGo(XmlyPlayActivity::class.java, bundle)
}
override fun onRefresh(refreshLayout: RefreshLayout) {
xmlyPage = 1
xmlyData.clear()
// presenter.getData(xmlyPage)
loadData()
}
override fun onLoadMore(refreshLayout: RefreshLayout) {
// presenter.getData(++xmlyPage,PAGE_SIZE)
xmlyPage = ++xmlyPage
loadData()
}
private fun initRvView() {
val gridLayoutManager = GridLayoutManager(context, 2)
xmlyPageVip.layoutManager = gridLayoutManager
xmlyPageAdapter = XmlyPageAdapter(null)
xmlyPageAdapter = XmlyPageAdapter(xmlyData)
xmlyPageVip.adapter = xmlyPageAdapter
xmlyPageAdapter.setOnItemClickListener(this)
}
......@@ -106,18 +119,20 @@ class XmlyPageFragment(private val categoryId: Int) : LazyLoadBaseFragment(),
/**
* 获取数据成功
*/
private fun getDataSuc(list: Any) {
// xmlyData.addAll(list)
// if (xmlyPage == 1) {
// srl_xmly.finishRefresh(true)
// xmlyPageAdapter?.notifyDataSetChanged()
// } else {
// if (list.size < PAGE_SIZE) {
// srl_xmly.finishLoadMoreWithNoMoreData()
// } else {
// srl_xmly.finishLoadMore()
// }
// xmlyPageAdapter?.notifyItemChanged(list.size)
// }
private fun getDataSuc(list: List<Album>) {
if (::xmlyPageAdapter.isInitialized) {
xmlyData.addAll(list)
if (xmlyPage == 1) {
srl_xmly.finishRefresh(true)
xmlyPageAdapter.notifyDataSetChanged()
} else {
if (list.size < PAGE_SIZE) {
srl_xmly.finishLoadMoreWithNoMoreData()
} else {
srl_xmly.finishLoadMore()
}
xmlyPageAdapter.notifyItemChanged(list.size)
}
}
}
}
\ No newline at end of file
/**
* ToolUtil.java
* com.chad.android.library.util
* <p/>
* <p/>
* ver date author
* ---------------------------------------
* 2015-4-9 chadwii
* <p/>
* Copyright (c) 2015, chadwii All Rights Reserved.
*/
package com.mints.goodmoney.utils;
import android.content.Context;
import android.text.TextUtils;
import com.ximalaya.ting.android.opensdk.constants.ConstantsOpenSdk;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* ClassName:ToolUtil
*
* @author chadwii
* @version
* @since Ver 1.1
* @Date 2015-4-9 5:17:32
*
* @see
*/
public class ToolUtil {
/**one hour in ms*/
private static final int ONE_HOUR = 1 * 60 * 60 * 1000;
/**one minute in ms*/
private static final int ONE_MIN = 1 * 60 * 1000;
/**one second in ms*/
private static final int ONE_SECOND = 1 * 1000;
private static int sScreenWidth;
private static int sScreenHeight;
private static float sDensity;
public static int dp2px(Context ctx, int dp) {
if (sDensity == 0) {
sDensity = ctx.getResources().getDisplayMetrics().density;
}
return (int) (dp * sDensity + 0.5f);
}
public static int px2dp(Context ctx, int px) {
if (sDensity == 0) {
sDensity = ctx.getResources().getDisplayMetrics().density;
}
return (int) (px / sDensity + 0.5f);
}
public static int getScreenWidth(Context ctx) {
if (sScreenWidth == 0) {
sScreenWidth = ctx.getResources().getDisplayMetrics().widthPixels;
}
return sScreenWidth;
}
public static int getScreenHeight(Context ctx) {
if (sScreenHeight == 0) {
sScreenHeight = ctx.getResources().getDisplayMetrics().heightPixels;
}
return sScreenHeight;
}
/**HH:mm:ss*/
public static String formatTime(long ms) {
StringBuilder sb = new StringBuilder();
int hour = (int) (ms / ONE_HOUR);
int min = (int) ((ms % ONE_HOUR) / ONE_MIN);
int sec = (int) (ms % ONE_MIN) / ONE_SECOND;
if (hour == 0) {
// sb.append("00:");
} else if (hour < 10) {
sb.append("0").append(hour).append(":");
} else {
sb.append(hour).append(":");
}
if (min == 0) {
sb.append("00:");
} else if (min < 10) {
sb.append("0").append(min).append(":");
} else {
sb.append(min).append(":");
}
if (sec == 0) {
sb.append("00");
} else if (sec < 10) {
sb.append("0").append(sec);
} else {
sb.append(sec);
}
return sb.toString();
}
public static boolean isEmpty(String str) {
if (str == null || str.trim().equals("") || str.trim().equals("null")) {
return true;
}
return false;
}
public static int isInTime(String time) throws IllegalArgumentException {
if (TextUtils.isEmpty(time) || !time.contains("-")
|| !time.contains(":")) {
if(ConstantsOpenSdk.isDebug) {
throw new IllegalArgumentException("Illegal Argument arg:" + time);
}else {
return -2;
}
}
String[] args = time.split("-");
boolean onlyHasHour = (args[0].split(":")).length == 2;
boolean hasDay = (args[0].split(":")).length == 3;
boolean hasYear = (args[0].split(":")).length == 5;
SimpleDateFormat sdf = null;
if (hasDay) {
sdf = new SimpleDateFormat("dd:HH:mm", Locale.getDefault());
} else if (hasYear) {
sdf = new SimpleDateFormat("yy:MM:dd:HH:mm", Locale.getDefault());
} else if (onlyHasHour) {
sdf = new SimpleDateFormat("HH:mm", Locale.getDefault());
}
if (sdf != null) {
String nowStr = sdf.format(new Date(System.currentTimeMillis()));
try {
long now = sdf.parse(nowStr).getTime();
long start = sdf.parse(args[0]).getTime();
if (args[1].contains("00:00") && hasDay) {
args[1] = (args[1].split(":"))[0] + ":" + "23:59";
} else if (args[1].contains("00:00") && hasYear) {
args[1] = (args[1].split(":"))[0] + ":"
+ (args[1].split(":"))[1] + ":"
+ (args[1].split(":"))[2] + ":" + "23:59";
} else if (args[1].contains("00:00") && onlyHasHour) {
args[1] = "23:59";
}
long end = sdf.parse(args[1]).getTime();
if (now >= end) {
return -1;
} else if (now >= start && now < end) {
return 0;
} else {
return 1;
}
} catch (ParseException e) {
e.printStackTrace();
if(ConstantsOpenSdk.isDebug) {
throw new IllegalArgumentException("Illegal Argument arg:"
+ time);
}else {
return -2;
}
}
}
return -2;
}
}
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/pre_icon_transparent_disable" android:state_enabled="false"></item>
<item android:drawable="@mipmap/pre_icon_transparent_pressed" android:state_enabled="true" android:state_pressed="true"></item>
<item android:drawable="@mipmap/pre_icon_transparent_normal" android:state_enabled="true" android:state_pressed="false"></item>
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical">
<include layout="@layout/header_layout" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:id="@+id/control_bar"
android:layout_width="match_parent"
android:layout_height="120dp"
android:gravity="center"
android:padding="10dp"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="3dp">
<ImageView
android:id="@+id/sound_cover"
android:layout_width="110dp"
android:layout_height="110dp"
android:layout_alignParentLeft="true"
android:scaleType="fitCenter"
android:src="@mipmap/ic_draw_phone" />
<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/sound_cover"
android:maxLines="1"
android:text="no play sound"
android:textColor="@color/color_333" />
<TextView
android:id="@+id/time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/message"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@id/sound_cover"
android:maxLines="1"
android:textColor="@color/color_333" />
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/time"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:layout_toRightOf="@+id/sound_cover"
android:maxHeight="10dp"
android:minHeight="10dp" />
<ProgressBar
android:id="@+id/buffering_progress"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:visibility="gone" />
<ImageButton
android:id="@+id/pre_sound"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/seek_bar"
android:layout_alignParentBottom="true"
android:scaleType="fitCenter"
android:src="@mipmap/pre_icon_transparent_normal" />
<ImageButton
android:id="@+id/play_or_pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/pre_sound"
android:layout_toRightOf="@+id/pre_sound"
android:scaleType="fitCenter"
android:src="@mipmap/widget_play_normal" />
<ImageButton
android:id="@+id/next_sound"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignTop="@+id/pre_sound"
android:layout_toRightOf="@+id/play_or_pause"
android:scaleType="fitCenter"
android:src="@mipmap/next_icon_transparent_normal" />
</RelativeLayout>
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/srl_xmly"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@+id/control_bar"
app:srlAccentColor="@color/gray"
app:srlPrimaryColor="@color/color_50E8E8E8">
<com.scwang.smartrefresh.layout.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/xmlyPageVip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@null"
android:overScrollMode="never" />
<com.scwang.smartrefresh.layout.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
......@@ -42,12 +42,6 @@
android:layout_height="wrap_content"
android:text="播放专辑内容" />
<Button
android:id="@+id/btn5"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放音频" />
</LinearLayout>
</com.mints.goodmoney.ui.widgets.ElasticScrollView>
......
......@@ -19,6 +19,9 @@
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:maxLength="12"
android:textColor="@color/color_121B32"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="6dp"
......@@ -20,6 +18,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="6dp"
android:ellipsize="end"
android:lines="1"
android:singleLine="true"
android:text="123213112321311232131123213112321311232131123213112321311232131123213112321311232131"
......
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="100dp">
<TextView
android:id="@+id/tv_index"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:text="1"
android:textColor="@color/color_333"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_title"
android:layout_width="260dp"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:ellipsize="end"
android:maxLines="2"
android:text="111111111111111"
android:textColor="@color/color_333"
android:textSize="16sp"
app:layout_constraintBottom_toTopOf="@id/tv_count"
app:layout_constraintStart_toEndOf="@+id/tv_index"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tv_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="20dp"
android:layout_marginTop="5dp"
android:drawableLeft="@mipmap/ic_headset"
android:drawablePadding="6dp"
android:gravity="center_vertical"
android:text="7.2亿"
android:textColor="@color/color_AAA"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/tv_index"
app:layout_constraintTop_toBottomOf="@id/tv_title" />
<TextView
android:id="@+id/tv_free"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:gravity="center_vertical"
android:text="7.2亿"
android:textColor="@color/color_AAA"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="@+id/tv_count"
app:layout_constraintStart_toEndOf="@+id/tv_count"
app:layout_constraintTop_toTopOf="@+id/tv_count" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -16,7 +16,7 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.0'
classpath 'com.android.tools.build:gradle:4.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
......
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