Commit 00243d6d authored by sheteng's avatar sheteng

2.0版本

parent cd104a8c
......@@ -13,6 +13,7 @@ data class GameInfo(
val boosterServer: String,
val createdDate: String,
val dnsServer: String,
val downloadType : Int,
val downloadUrl: String,
val gameName: String,
val icon: String,
......@@ -36,5 +37,6 @@ data class Announcement(
val id: Int,
val status: Int,
val title: String,
val url: String
val url: String,
val type: Int
)
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.ccwangluo.accelerator.ui.gameList
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
......@@ -17,19 +18,25 @@ import com.ccwangluo.accelerator.R
import com.ccwangluo.accelerator.adapter.KotlinDataAdapter
import com.ccwangluo.accelerator.databinding.FragmentGameListBinding
import com.ccwangluo.accelerator.manager.GameDownLoadManger
import com.ccwangluo.accelerator.manager.LoginUtils
import com.ccwangluo.accelerator.model.Announcement
import com.ccwangluo.accelerator.model.GameInfo
import com.ccwangluo.accelerator.ui.dialog.CommonDialog
import com.ccwangluo.accelerator.ui.dialog.GameDownloadDialog
import com.ccwangluo.accelerator.ui.home.AcceleratorFragment
import com.ccwangluo.accelerator.utils.AcceleratorUtils
import com.ccwangluo.accelerator.utils.ByteUtils
import com.ccwangluo.accelerator.utils.ShareUtils
import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.ui.home.NewsFragment
import com.ccwangluo.accelerator.ui.web.CommonWebViewFragment
import com.ccwangluo.accelerator.utils.*
import com.ccwangluo.accelerator.utils.datareport.DataRePortUtils
import com.github.shadowsocks.bg.BaseService
import com.github.shadowsocks.http.HttpConfig
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
import com.xuexiang.xui.widget.progress.CircleProgressView
import com.xuexiang.xutil.app.AppUtils
import com.xuexiang.xutil.tip.ToastUtils
import java.util.*
import java.util.stream.Collectors
class GameListFragment : XPageFragment() {
......@@ -51,7 +58,7 @@ class GameListFragment : XPageFragment() {
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
_binding = FragmentGameListBinding.inflate(inflater!!, container, false)
gameListModel = ViewModelProvider(this).get(GameListModel::class.java)
return _binding!!.root
return _binding.root
}
override fun initViews() {
......@@ -88,6 +95,55 @@ class GameListFragment : XPageFragment() {
val tx_download_size = itemView.findViewById<TextView>(R.id.tx_download_size)
val tx_status = itemView.findViewById<TextView>(R.id.tx_status)
//公告
val game_notice_area_1 = itemView.findViewById<View>(R.id.game_notice_area_1)
val game_notice_area_2 = itemView.findViewById<View>(R.id.game_notice_area_2)
val game_notice_2_1 = itemView.findViewById<TextView>(R.id.game_notice_2_1)
val game_notice_1_1 = itemView.findViewById<TextView>(R.id.game_notice_1_1)
val game_notice_1_2 = itemView.findViewById<TextView>(R.id.game_notice_1_2)
val game_notice_1_3 = itemView.findViewById<TextView>(R.id.game_notice_1_3)
val announcement1 = itemData.announcementList.stream().filter { it.type == 1 }
.collect(Collectors.toList())
if (announcement1 == null || announcement1.size == 0) {
game_notice_area_1.visibility = View.GONE
} else {
game_notice_area_1.visibility = View.VISIBLE
game_notice_1_1.setText(announcement1.get(0).title)
game_notice_1_1.setOnClickListener {
openNoticePage(announcement1.get(0))
}
if (announcement1.size > 1) {
game_notice_1_2.visibility = View.VISIBLE
game_notice_1_2.setText(announcement1.get(1).title)
game_notice_1_2.setOnClickListener {
openNoticePage(announcement1.get(1))
}
} else {
game_notice_1_2.visibility = View.GONE
}
if (announcement1.size > 2) {
game_notice_1_3.visibility = View.VISIBLE
game_notice_1_3.setText(announcement1.get(2).title)
game_notice_1_3.setOnClickListener {
openNoticePage(announcement1.get(2))
}
} else {
game_notice_1_3.visibility = View.GONE
}
}
val announcement2 = itemData.announcementList.stream().filter { it.type == 2 }
.collect(Collectors.toList())
if (announcement2 == null || announcement2.size == 0) {
game_notice_area_2.visibility = View.GONE
} else {
game_notice_area_2.visibility = View.VISIBLE
game_notice_2_1.setText(announcement2.get(0).content)
game_notice_area_2.setOnClickListener {
openNoticePage(announcement2.get(0))
}
}
Glide.with(this@GameListFragment)
.load(itemData.icon)
......@@ -123,7 +179,9 @@ class GameListFragment : XPageFragment() {
progress_download.progress = it.progress
}
} else if (!SysUtils.isPackageInstall(it, itemData.packageName)) {
}
//应用未安装
else if (!SysUtils.isPackageInstall(it, itemData.packageName)) {
btn_uninstall.visibility = View.VISIBLE
btn_acc.visibility = View.GONE
btn_acc_stop.visibility = View.GONE
......@@ -131,6 +189,19 @@ class GameListFragment : XPageFragment() {
tx_download_status.visibility = View.GONE
btn_download_status.visibility = View.GONE
}
//应用升级
else if (!SysUtils.compareVersionTo(
AppUtils.getAppVersionName(itemData.packageName),
itemData.version
)
) {
btn_uninstall.visibility = View.GONE
btn_acc.visibility = View.VISIBLE
btn_acc_stop.visibility = View.GONE
tx_game_update_notice.visibility = View.VISIBLE
tx_download_status.visibility = View.GONE
btn_download_status.visibility = View.GONE
} else if (AcceleratorUtils.state == BaseService.State.Connected && AcceleratorUtils.game!!.id == itemData.id) {
btn_uninstall.visibility = View.GONE
btn_acc.visibility = View.GONE
......@@ -162,8 +233,22 @@ class GameListFragment : XPageFragment() {
}
btn_acc.setOnClickListener {
if (AcceleratorUtils.state == BaseService.State.Connected) {
context?.let {
CommonDialog(it)
.setContent("当前${AcceleratorUtils.game?.gameName}应用正在加速,是否取消")
.setBtnLeft("取消") {
}.setBtnRight("确定") {
AcceleratorUtils.stopAccelerator()
AcceleratorUtils.setGameInfo(itemData)
openPage(AcceleratorFragment::class.java)
}.show<CommonDialog>()
}
} else {
AcceleratorUtils.setGameInfo(itemData)
openPage(AcceleratorFragment::class.java)
}
}
game_name.setOnClickListener {
......@@ -171,7 +256,7 @@ class GameListFragment : XPageFragment() {
}
tx_game_update_notice.setOnClickListener {
download(itemData)
}
}
.create()
......@@ -217,6 +302,19 @@ class GameListFragment : XPageFragment() {
registerListener()
}
private fun openNoticePage(ann: Announcement) {
if (ann.type == 2) {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, ann.url)
params.putInt(CommonWebViewFragment.GAME_ID, ann.gameId)
openPage(CommonWebViewFragment::class.java, params)
} else if (ann.type == 1) {
val params = Bundle()
params.putInt(Constants.GAME_ID, ann.gameId)
openPage(NewsFragment::class.java)
}
}
override fun initListeners() {
_binding.accShare.setOnClickListener {
DataRePortUtils.report("st_share_clk", mapOf("scene" to "3"))
......@@ -263,17 +361,28 @@ class GameListFragment : XPageFragment() {
acctime = l
if (state == BaseService.State.Connected) {
Handler(Looper.getMainLooper()).post {
AcceleratorUtils.game?.let {
if (dataList.indexOf(AcceleratorUtils.game) == 0) {
_binding.gameList.adapter?.notifyItemChanged(
dataList.indexOf(
AcceleratorUtils.game
)
0
)
} else {
dataList.remove(it)
dataList.add(0, it)
_binding.gameList.adapter?.notifyDataSetChanged()
}
}
}
}
}
}
fun download(itemData: GameInfo) {
//
if (itemData.downloadType != 0) {
ToastUtils.toast("暂不提供下载功能,请前往游戏官网下载~")
return
}
activity?.let {
if (itemData.downloadUrl.endsWith(".apk")) {
GameDownloadDialog(
......
......@@ -8,6 +8,7 @@ import com.ccwangluo.accelerator.model.GameInfo
import com.ccwangluo.accelerator.utils.SysUtils
import com.ccwangluo.accelerator.utils.http.HttpGo
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xutil.app.AppUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
......@@ -16,9 +17,11 @@ class GameListModel : ViewModel() {
val gameModel = MutableLiveData<Game>()
val clearList = MutableLiveData<Boolean>()
fun freshData(xPageFragment: XPageFragment,page: Int) {
fun freshData(xPageFragment: XPageFragment, page: Int) {
xPageFragment.lifecycleScope.launch(Dispatchers.IO) {
val res = HttpGo.getSync<Game>("/api/new/game/list?page=${page}&size=10&channelId=${SysUtils.getChannel()}")
val res =
HttpGo.getSync<Game>("/api/new/game/list?page=${page}&size=20&channelId=${SysUtils.getChannel()}")
res?.let {
it.data?.let {
clearList.postValue(page == 1)
......
......@@ -65,7 +65,7 @@ class AcceleratorFragment : XPageFragment() {
override fun initViews() {
acceleratorViewModel.netState.observe(this, {
acceleratorViewModel.netState.observe(this) {
if (it.preNetDelay != -1 && state == BaseService.State.Connected) { //有网络
binding.preDelay1.setText(it.preNetDelay.toString())
......@@ -110,7 +110,7 @@ class AcceleratorFragment : XPageFragment() {
binding.netQuality.setText(SysUtils.getnetQuality(it.preNetDelay))
}
binding.activeNetwork.setText(SysUtils.getActiveNet())
})
}
acceleratorViewModel.accState.observe(this) {
binding.accStateTx.setText("加速中 ${SysUtils.getAccTimeString(accTimer)}")
......@@ -313,6 +313,7 @@ class AcceleratorFragment : XPageFragment() {
fun openToWebview(url: String) {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, HttpConfig.UI_MAIN_URL + url)
params.putInt(CommonWebViewFragment.GAME_ID, AcceleratorUtils.game!!.id)
LoginUtils.token?.let {
openPage(CommonWebViewFragment::class.java, params)
} ?: let {
......@@ -338,6 +339,7 @@ class AcceleratorFragment : XPageFragment() {
LoginUtils.token?.let {
PageOption.to(CommonWebViewFragment::class.java)
.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, HttpConfig.UI_MAIN_URL + url)
.putInt(CommonWebViewFragment.GAME_ID, AcceleratorUtils.game!!.id)
.setRequestCode(CLICK_START_ACC_REQUEST_CODE)
.open(this)
} ?: let {
......
......@@ -29,10 +29,12 @@ import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.hjq.toast.ToastUtils
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.base.XPageFragment
import com.xuexiang.xpage.utils.TitleBar
import com.xuexiang.xutil.app.AppUtils
@Page(name = "news")
class NewsFragment : XPageFragment() {
private var _binding: FragmentNewsBinding? = null
private val binding get() = _binding!!
......@@ -42,6 +44,8 @@ class NewsFragment : XPageFragment() {
return null
}
private var gameId: Int = 0
var dataList = arrayListOf<Plugin>()
override fun inflateView(inflater: LayoutInflater?, container: ViewGroup?): View {
......@@ -53,6 +57,7 @@ class NewsFragment : XPageFragment() {
val titles = arrayOf("全部", "攻略", "视频", "评价", "问答")
var adapter: NewsCollectionAdapter? = null
override fun initViews() {
gameId = arguments?.getInt(CommonWebViewFragment.GAME_ID)!!
newsViewModel.notice.observe(this) { it1 ->
binding.newsNotice.visibility = View.VISIBLE
binding.tvMarquee.addDisplayString(it1.title)
......@@ -175,10 +180,9 @@ class NewsFragment : XPageFragment() {
})
AcceleratorUtils.game?.let {
newsViewModel.getNotice(it.id)
newsViewModel.getPlugin(it.id)
}
newsViewModel.getNotice(gameId)
newsViewModel.getPlugin(gameId)
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
......@@ -191,6 +195,7 @@ class NewsFragment : XPageFragment() {
fun openToWebviewNative(url: String) {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, HttpConfig.UI_MAIN_URL + url)
params.putInt(CommonWebViewFragment.GAME_ID, gameId)
openPage(CommonWebViewFragment::class.java, params)
}
......@@ -198,6 +203,7 @@ class NewsFragment : XPageFragment() {
fun openToWebview(url: String) {
val params = Bundle()
params.putString(CommonWebViewFragment.WEBVIEW_URL_KEY, url)
params.putInt(CommonWebViewFragment.GAME_ID, gameId)
openPage(CommonWebViewFragment::class.java, params)
}
......
......@@ -42,6 +42,7 @@ class CommonWebViewFragment : XPageFragment() {
override fun initViews() {
val url = arguments?.getString(WEBVIEW_URL_KEY)
val gameId = arguments?.getInt(GAME_ID)
show_title = arguments?.getBoolean(SHOW_TITLE) ?: false
if (show_title) {
binding.webBar.visibility = View.VISIBLE
......@@ -59,10 +60,10 @@ class CommonWebViewFragment : XPageFragment() {
var weburl = it
if (weburl.contains("?")) {
weburl =
weburl + "&channel=${SysUtils.getChannel()}&gameId=${AcceleratorUtils.game?.id}"
weburl + "&channel=${SysUtils.getChannel()}&gameId=${gameId}"
} else {
weburl =
weburl + "?channel=${SysUtils.getChannel()}&gameId=${AcceleratorUtils.game?.id}"
weburl + "?channel=${SysUtils.getChannel()}&gameId=${gameId}"
}
LoginUtils.token?.let {
weburl = weburl + "&token=${it}"
......@@ -192,5 +193,6 @@ class CommonWebViewFragment : XPageFragment() {
companion object {
val WEBVIEW_URL_KEY = "WEBVIEW_URL_KEY"
val SHOW_TITLE = "SHOW_TITLE"
val GAME_ID = "GAME_ID"
}
}
\ No newline at end of file
package com.ccwangluo.accelerator.utils
class Constants {
companion object {
val GAME_ID = "GAME_ID"
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.ccwangluo.accelerator.utils
import android.content.Context
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import android.net.Uri
......@@ -191,4 +192,48 @@ object SysUtils {
return MMKV.defaultMMKV().decodeString("device_uuid", null)
}
fun compareVersionTo(localVersion: String?, remoteVersion: String?): Boolean {
try {
if (TextUtils.isEmpty(localVersion) || TextUtils.isEmpty(remoteVersion)) {
return true
}
val local = localVersion!!.split("\\.")
val remote = remoteVersion!!.split("\\.")
if (local.size != remote.size || local.size == 0) {
return true
}
for (i in 0..local.size) {
if (local[i].toInt() < remote[i].toInt()) {
return false
}
}
} catch (e: java.lang.Exception) {
}
return true
}
/**
* 获取手机已安装应用列表
* @param ctx
* @return
*/
fun getAllAppInfo(ctx: Context): ArrayList<String?>? {
val appBeanList: ArrayList<String?> = ArrayList()
val packageManager = ctx.packageManager
val list = packageManager.getInstalledPackages(0)
for (p in list) {
val flags = p.applicationInfo.flags
// 判断是否是属于系统的apk
if (flags != ApplicationInfo.FLAG_SYSTEM) {
appBeanList.add(p.applicationInfo.packageName)
}
}
return appBeanList
}
}
\ No newline at end of file
......@@ -10,6 +10,7 @@ import com.google.gson.reflect.TypeToken
import com.hjq.toast.ToastUtils
import com.xuexiang.xutil.XUtil
import okhttp3.*
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody
import timber.log.Timber
......@@ -79,7 +80,6 @@ object HttpGo {
return null
}
val jsonType get() = "application/json; charset=utf-8".toMediaTypeOrNull()
......
......@@ -215,6 +215,7 @@
</RelativeLayout>
<LinearLayout
android:visibility="gone"
android:id="@+id/game_page"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......
......@@ -214,6 +214,7 @@
android:background="@color/divide_gray" />
<LinearLayout
android:id="@+id/game_notice_area_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="7.75dp"
......@@ -221,11 +222,13 @@
android:orientation="horizontal">
<TextView
android:id="@+id/game_notice_1_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:maxLength="6"
android:text="资讯社区"
android:textColor="#FF36B8F4"
android:textSize="11.5sp" />
......@@ -237,11 +240,13 @@
android:background="@color/divide_gray" />
<TextView
android:id="@+id/game_notice_1_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:gravity="center"
android:maxLength="6"
android:text="资讯社区"
android:textColor="#FF36B8F4"
android:textSize="11.5sp" />
......@@ -253,10 +258,12 @@
android:background="@color/divide_gray" />
<TextView
android:id="@+id/game_notice_1_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_weight="1"
android:maxLength="6"
android:gravity="center"
android:text="资讯社区"
android:textColor="#FF36B8F4"
......@@ -264,6 +271,42 @@
</LinearLayout>
<RelativeLayout
android:id="@+id/game_notice_area_2"
android:layout_width="match_parent"
android:layout_height="30dp"
android:layout_marginTop="9dp"
android:layout_marginBottom="9.5dp"
android:layout_marginLeft="22.5dp"
android:layout_marginRight="22.5dp"
android:orientation="horizontal"
android:background="@drawable/acc_text_bg_blue"
>
<TextView
android:id="@+id/game_notice_2_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="【最新消息】常见问题解答,更新了~"
android:textColor="#FF36B8F4"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:textSize="11sp"
/>
<TextView
android:layout_width="22dp"
android:layout_height="15dp"
android:text="查看 >"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="5dp"
android:textColor="#FF36B8F4"
android:textSize="11sp"
/>
</RelativeLayout>
<View
android:layout_width="match_parent"
android:layout_height="13dp"
......
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