Keyboard-Journey/app/src/main/java/com/keyboard/journey/JourneyMActivity.kt
2024-07-18 14:45:59 +08:00

323 lines
12 KiB
Kotlin

package com.keyboard.journey
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.util.Log
import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.gyf.immersionbar.ktx.immersionBar
import com.keyboard.journey.adapter.BannerImgAdapter
import com.keyboard.journey.adapter.MainDataAdapter
import com.keyboard.journey.bean.CategoryDataBean
import com.keyboard.journey.bean.MainDataBean
import com.keyboard.journey.databinding.JourneyActivityMainBinding
import com.keyboard.journey.util.NetworkCallback
import com.keyboard.journey.util.NetworkUtil
import com.keyboard.journey.util.getRandomInt
import com.keyboard.journey.util.isMyInputMethodDefault
import com.keyboard.journey.util.isMyInputMethodEnabled
import com.keyboard.journey.util.shareAppInfo
import com.youth.banner.listener.OnPageChangeListener
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.awaitAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import org.libpag.PAGFile
import kotlin.coroutines.resume
class JourneyMActivity : AppCompatActivity() {
private lateinit var binding: JourneyActivityMainBinding
private var imgList: MutableList<Int> = mutableListOf()
private var dataList: MutableList<MainDataBean> = mutableListOf()
private var mainAdapter: MainDataAdapter? = null
private var backPressedOnce = false
private var currentBannerType = 0
private lateinit var bannerStr0: String
private lateinit var bannerStr1: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = JourneyActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
bannerStr0 = getString(R.string.recommend)
bannerStr1 = getString(R.string.cool)
initBar()
initView()
initData()
}
private suspend fun getFetchCategory(
key: String,
offset: Int,
pageSize: Int,
): CategoryDataBean? {
return try {
suspendCancellableCoroutine<CategoryDataBean> { continuation ->
NetworkUtil().fetchCategory(
key,
offset,
pageSize,
object : NetworkCallback<List<CategoryDataBean>> {
override fun onSuccess(data: List<CategoryDataBean>) {
continuation.resume(data[0])
}
override fun onFailure(errorMessage: String) {
}
})
}
} catch (e: Exception) {
return null
}
}
@OptIn(DelicateCoroutinesApi::class)
private fun initData() {
loadingPlay()
NetworkUtil().fetchData(object : NetworkCallback<List<MainDataBean>> {
@SuppressLint("NotifyDataSetChanged")
override fun onSuccess(data: List<MainDataBean>) {
GlobalScope.launch(Dispatchers.IO) {
val jobs = data.map { bean ->
GlobalScope.async(Dispatchers.IO) {
val resultCategory = getFetchCategory(
bean.key, getRandomInt(1, 15),
getRandomInt(5, 16),
)
bean.items = resultCategory?.items!!
bean
}
}
val list = awaitAll(*jobs.toTypedArray())
withContext(Dispatchers.Main) {
dataList.clear()
dataList.addAll(list)
Log.d(JourneyApp.TAG, "--------------dataList=${dataList.size}")
mainAdapter?.notifyDataSetChanged()
loadingClose()
}
}
}
override fun onFailure(errorMessage: String) {
LogUtil.logMsgD(errorMessage)
}
})
}
private fun initBar() {
immersionBar {
statusBarDarkFont(true)
statusBarView(binding.view)
}
}
private fun setupDrawerListener() {
binding.drawer.addDrawerListener(object : DrawerLayout.DrawerListener {
override fun onDrawerSlide(drawerView: View, slideOffset: Float) {}
override fun onDrawerOpened(drawerView: View) {
drawerView.isClickable = true
}
override fun onDrawerClosed(drawerView: View) {}
override fun onDrawerStateChanged(newState: Int) {}
})
}
private fun initClick() {
binding.menuBtn.setOnClickListener {
if (binding.drawer.isDrawerOpen(GravityCompat.START)) {
binding.drawer.closeDrawer(GravityCompat.START)
} else {
binding.drawer.openDrawer(GravityCompat.START)
}
}
binding.bannerBtn.setOnClickListener {
for (data in dataList) {
Log.d(JourneyApp.TAG, "---------- data=${data.title}")
}
val recommend = dataList.filter { it.title.contains("For You") }
val cool = dataList.filter { it.title.contains(bannerStr1) }
if (currentBannerType == 0) {
Log.d(JourneyApp.TAG, "----------0 recommend.size=${recommend.size}")
val intent = Intent(this, JourneyCategoryDetailsActivity::class.java)
intent.putExtra(
JourneyCategoryDetailsActivity.CATEGORY_DETAILS_BEAN_KEY,
recommend[0]
)
startActivity(intent)
} else if (currentBannerType == 1) {
Log.d(JourneyApp.TAG, "----------1 cool.size=${cool.size}")
val intent = Intent(this, JourneyCategoryDetailsActivity::class.java)
intent.putExtra(JourneyCategoryDetailsActivity.CATEGORY_DETAILS_BEAN_KEY, cool[0])
startActivity(intent)
}
}
binding.applyKeyboardBtn.setOnClickListener {
val enabled = isMyInputMethodEnabled(this)
val default = isMyInputMethodDefault(this)
if (enabled && default) {
binding.dialogStepLayout.visibility = View.GONE
Toast.makeText(
this,
"The keyboard has been set up successfully!",
Toast.LENGTH_SHORT
).show()
} else {
binding.dialogStepLayout.visibility = View.VISIBLE
updateSetMyInputMethod()
}
}
binding.step1Btn.setOnClickListener {
val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
startActivity(intent)
}
binding.step2Btn.setOnClickListener {
val imeManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imeManager.showInputMethodPicker()
}
binding.dialogStepLayout.setOnClickListener {
binding.dialogStepLayout.visibility = View.GONE
}
binding.privacyBtn.setOnClickListener {
val privacyPolicyUrl = "https://sites.google.com/view/privacy-policy-html-app"
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(privacyPolicyUrl)
startActivity(intent)
}
binding.shareBtn.setOnClickListener {
shareAppInfo(this)
}
}
override fun onBackPressed() {
if (binding.drawer.isDrawerOpen(GravityCompat.START)) {
binding.drawer.closeDrawer(GravityCompat.START);
} else {
if (backPressedOnce) {
super.onBackPressed()
return
}
backPressedOnce = true
Toast.makeText(this, "Press again to exit!", Toast.LENGTH_SHORT).show()
// 两秒钟内再次按返回键取消退出操作
val handler = android.os.Handler()
handler.postDelayed({ backPressedOnce = false }, 2000)
}
}
private fun initView() {
binding.rv.layoutManager = LinearLayoutManager(this)
mainAdapter = MainDataAdapter(this, dataList)
binding.rv.adapter = mainAdapter
imgList.add(R.mipmap.recommend_top_banner_img)
imgList.add(R.mipmap.cool_top_banner_img)
val adapter = BannerImgAdapter(imgList)
binding.banner.setAdapter(adapter).addBannerLifecycleObserver(this) //添加生命周期观察者
binding.banner.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
}
override fun onPageSelected(position: Int) {
when (position) {
0 -> {
currentBannerType = 0
binding.indicatorLayout.setBackgroundColor(getColor(R.color.banner_indicator_one_bg))
binding.indicatorImg.setImageResource(R.mipmap.top_banner_one_img)
binding.indicatorTxt.text = bannerStr0
binding.indicatorGoBg.setCardBackgroundColor(getColor(R.color.banner_indicator_one_go_bg_color))
binding.indicatorLineOneBg.setBackgroundColor(getColor(R.color.banner_indicator_one_go_bg_color))
binding.indicatorLineTowBg.setBackgroundColor(getColor(R.color.black_10))
}
1 -> {
currentBannerType = 1
binding.indicatorLayout.setBackgroundColor(getColor(R.color.banner_indicator_tow_bg))
binding.indicatorImg.setImageResource(R.mipmap.top_banner_tow_img)
binding.indicatorTxt.text = bannerStr1
binding.indicatorGoBg.setCardBackgroundColor(getColor(R.color.banner_indicator_tow_go_bg_color))
binding.indicatorLineOneBg.setBackgroundColor(getColor(R.color.black_10))
binding.indicatorLineTowBg.setBackgroundColor(getColor(R.color.banner_indicator_tow_go_bg_color))
}
}
}
override fun onPageScrollStateChanged(state: Int) {
}
})
setupDrawerListener()
initClick()
}
private fun loadingPlay() {
binding.loadingLayout.visibility = View.VISIBLE
binding.indicatorGoBg.visibility = View.GONE
val pagFile = PAGFile.Load(assets, "loading.pag")
binding.pagView.composition = pagFile
binding.pagView.setRepeatCount(0)
binding.pagView.play()
}
private fun loadingClose() {
binding.loadingLayout.visibility = View.GONE
binding.indicatorGoBg.visibility = View.VISIBLE
if (binding.pagView.isPlaying) {
binding.pagView.stop()
}
}
private fun updateSetMyInputMethod() {
val enabled = isMyInputMethodEnabled(this)
val default = isMyInputMethodDefault(this)
if (enabled) {
binding.step1Btn.background = getDrawable(R.drawable.drw_gray_select_bg)
binding.step1Btn.text = "Step 1:Enabled"
binding.step1Btn.setTextColor(Color.parseColor("#999999"))
} else {
binding.step1Btn.background = getDrawable(R.mipmap.activate_btn_bg)
binding.step1Btn.text = "Step 1:Select"
binding.step1Btn.setTextColor(Color.parseColor("#000000"))
}
if (default) {
binding.step2Btn.background = getDrawable(R.drawable.drw_gray_select_bg)
binding.step2Btn.text = "Step 2:Enabled"
binding.step1Btn.setTextColor(Color.parseColor("#999999"))
} else {
binding.step2Btn.background = getDrawable(R.mipmap.activate_btn_bg)
binding.step2Btn.text = "Step 2:Select"
binding.step1Btn.setTextColor(Color.parseColor("#000000"))
}
}
}