diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..b589d56
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
new file mode 100644
index 0000000..b268ef3
--- /dev/null
+++ b/.idea/deploymentTargetSelector.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
new file mode 100644
index 0000000..cb865f6
--- /dev/null
+++ b/.idea/gradle.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..824785d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index c105bc3..093ed3d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -5,6 +5,7 @@ plugins {
id 'org.jetbrains.kotlin.android'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
+ id 'kotlin-kapt'
}
String timestamp = new SimpleDateFormat("MM_dd_HH_mm").format(new Date())
@@ -17,8 +18,8 @@ android {
applicationId "com.keyboards.journey"
minSdk 23
targetSdk 34
- versionCode 6
- versionName "1.0.6"
+ versionCode 8
+ versionName "1.0.8"
setProperty("archivesBaseName", "Keyboard Journey_V" + versionName + "(${versionCode})_$timestamp")
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
@@ -30,11 +31,11 @@ android {
}
}
compileOptions {
- sourceCompatibility JavaVersion.VERSION_1_8
- targetCompatibility JavaVersion.VERSION_1_8
+ sourceCompatibility JavaVersion.VERSION_17
+ targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
- jvmTarget = '1.8'
+ jvmTarget = '17'
}
buildFeatures {
viewBinding true
@@ -71,8 +72,11 @@ dependencies {
//7z
implementation 'com.github.omicronapps:7-Zip-JBinding-4Android:Release-16.02-2.02'
-
-
+ implementation("com.github.lihangleo2:ShadowLayout:3.4.0")
+ implementation("androidx.room:room-ktx:2.6.1")
+ implementation("androidx.room:room-runtime:2.6.1")
+ //noinspection KaptUsageInsteadOfKsp
+ kapt("androidx.room:room-compiler:2.6.1")
implementation(platform("com.google.firebase:firebase-bom:32.2.2"))
implementation("com.google.firebase:firebase-analytics-ktx")
implementation("com.google.firebase:firebase-crashlytics-ktx")
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b53dcff..55ae5ea 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -28,7 +28,7 @@
diff --git a/app/src/main/java/com/keyboard/journey/JourneyMActivity.kt b/app/src/main/java/com/keyboard/journey/HomeFragment.kt
similarity index 53%
rename from app/src/main/java/com/keyboard/journey/JourneyMActivity.kt
rename to app/src/main/java/com/keyboard/journey/HomeFragment.kt
index 63b98b0..be60bb1 100644
--- a/app/src/main/java/com/keyboard/journey/JourneyMActivity.kt
+++ b/app/src/main/java/com/keyboard/journey/HomeFragment.kt
@@ -2,17 +2,12 @@ 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.LayoutInflater
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 android.view.ViewGroup
+import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import com.gyf.immersionbar.ktx.immersionBar
import com.keyboard.journey.adapter.BannerImgAdapter
@@ -23,9 +18,6 @@ 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
@@ -39,21 +31,25 @@ import org.libpag.PAGFile
import kotlin.coroutines.resume
-class JourneyMActivity : AppCompatActivity() {
+class HomeFragment : Fragment() {
private lateinit var binding: JourneyActivityMainBinding
private var imgList: MutableList = mutableListOf()
private var dataList: MutableList = 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)
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
binding = JourneyActivityMainBinding.inflate(layoutInflater)
- setContentView(binding.root)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
bannerStr0 = getString(R.string.recommend)
bannerStr1 = getString(R.string.cool)
initBar()
@@ -61,6 +57,24 @@ class JourneyMActivity : AppCompatActivity() {
initData()
}
+ override fun onResume() {
+ super.onResume()
+ initImmersionBar()
+ }
+
+ override fun onHiddenChanged(hidden: Boolean) {
+ super.onHiddenChanged(hidden)
+ if (!hidden) {
+ initImmersionBar()
+ }
+ }
+
+ private fun initImmersionBar() {
+ immersionBar {
+ statusBarDarkFont(true)
+ statusBarView(binding.view)
+ }
+ }
private suspend fun getFetchCategory(
key: String,
@@ -69,8 +83,7 @@ class JourneyMActivity : AppCompatActivity() {
): CategoryDataBean? {
return try {
suspendCancellableCoroutine { continuation ->
- NetworkUtil().fetchCategory(
- key,
+ NetworkUtil().fetchCategory(key,
offset,
pageSize,
object : NetworkCallback> {
@@ -90,6 +103,7 @@ class JourneyMActivity : AppCompatActivity() {
@OptIn(DelicateCoroutinesApi::class)
private fun initData() {
loadingPlay()
+ binding.noDataLayout.visibility = View.GONE
NetworkUtil().fetchData(object : NetworkCallback> {
@SuppressLint("NotifyDataSetChanged")
override fun onSuccess(data: List) {
@@ -111,6 +125,11 @@ class JourneyMActivity : AppCompatActivity() {
Log.d(JourneyApp.TAG, "--------------dataList=${dataList.size}")
mainAdapter?.notifyDataSetChanged()
loadingClose()
+ if (dataList.size > 0) {
+ binding.noDataLayout.visibility = View.GONE
+ } else {
+ binding.noDataLayout.visibility = View.VISIBLE
+ }
}
}
@@ -118,6 +137,8 @@ class JourneyMActivity : AppCompatActivity() {
override fun onFailure(errorMessage: String) {
LogUtil.logMsgD(errorMessage)
+ binding.noDataLayout.visibility = View.VISIBLE
+ loadingClose()
}
})
}
@@ -129,27 +150,9 @@ class JourneyMActivity : AppCompatActivity() {
}
}
- 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.tryAgain.setOnClickListener {
+ initData()
}
binding.bannerBtn.setOnClickListener {
for (data in dataList) {
@@ -159,80 +162,31 @@ class JourneyMActivity : AppCompatActivity() {
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)
+ if (recommend.isNotEmpty()) {
+ val intent =
+ Intent(requireActivity(), 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)
+ if (cool.isNotEmpty()) {
+ val intent =
+ Intent(requireActivity(), 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.layoutManager = LinearLayoutManager(requireActivity())
+ mainAdapter = MainDataAdapter(requireActivity(), dataList)
binding.rv.adapter = mainAdapter
imgList.add(R.mipmap.recommend_top_banner_img)
@@ -241,9 +195,7 @@ class JourneyMActivity : AppCompatActivity() {
binding.banner.setAdapter(adapter).addBannerLifecycleObserver(this) //添加生命周期观察者
binding.banner.addOnPageChangeListener(object : OnPageChangeListener {
override fun onPageScrolled(
- position: Int,
- positionOffset: Float,
- positionOffsetPixels: Int
+ position: Int, positionOffset: Float, positionOffsetPixels: Int
) {
}
@@ -252,22 +204,22 @@ class JourneyMActivity : AppCompatActivity() {
when (position) {
0 -> {
currentBannerType = 0
- binding.indicatorLayout.setBackgroundColor(getColor(R.color.banner_indicator_one_bg))
+ binding.indicatorLayout.setBackgroundColor(requireActivity().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))
+ binding.indicatorGoBg.background = requireActivity().getDrawable(R.drawable.draw_go_bg)
+ binding.indicatorLineOneBg.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_one_go_bg_color))
+ binding.indicatorLineTowBg.setBackgroundColor(requireActivity().getColor(R.color.black_10))
}
1 -> {
currentBannerType = 1
- binding.indicatorLayout.setBackgroundColor(getColor(R.color.banner_indicator_tow_bg))
+ binding.indicatorLayout.setBackgroundColor(requireActivity().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))
+ binding.indicatorGoBg.background = requireActivity().getDrawable(R.drawable.draw_go_2_bg)
+ binding.indicatorLineOneBg.setBackgroundColor(requireActivity().getColor(R.color.black_10))
+ binding.indicatorLineTowBg.setBackgroundColor(requireActivity().getColor(R.color.banner_indicator_tow_go_bg_color))
}
}
}
@@ -276,14 +228,13 @@ class JourneyMActivity : AppCompatActivity() {
}
})
- setupDrawerListener()
initClick()
}
private fun loadingPlay() {
binding.loadingLayout.visibility = View.VISIBLE
binding.indicatorGoBg.visibility = View.GONE
- val pagFile = PAGFile.Load(assets, "loading.pag")
+ val pagFile = PAGFile.Load(requireActivity().assets, "loading.pag")
binding.pagView.composition = pagFile
binding.pagView.setRepeatCount(0)
binding.pagView.play()
@@ -296,28 +247,4 @@ class JourneyMActivity : AppCompatActivity() {
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"))
- }
- }
-
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keyboard/journey/JourneyApp.kt b/app/src/main/java/com/keyboard/journey/JourneyApp.kt
index ba028f0..695ba57 100644
--- a/app/src/main/java/com/keyboard/journey/JourneyApp.kt
+++ b/app/src/main/java/com/keyboard/journey/JourneyApp.kt
@@ -4,6 +4,7 @@ import android.app.Application
import android.util.Log
import com.anythink.core.api.ATSDK
import com.anythink.core.api.NetTrafficeCallback
+import com.keyboard.journey.db.DatabaseManager
//import com.anythink.debug.api.ATDebuggerUITest
import com.keyboard.journey.topon.AdManager
@@ -11,6 +12,9 @@ class JourneyApp : Application() {
companion object {
lateinit var app: JourneyApp
const val TAG = "----------"
+
+ lateinit var databaseManager: DatabaseManager
+ private set
}
private val APPId="h6697811556e91"
private val APPKey="44f890794fdaec43c4df6cc60e345eb2"
@@ -18,6 +22,7 @@ class JourneyApp : Application() {
override fun onCreate() {
super.onCreate()
app = this
+ databaseManager = DatabaseManager.getInstance(this)
initSDK()
}
diff --git a/app/src/main/java/com/keyboard/journey/JourneyCategoryDetailsActivity.kt b/app/src/main/java/com/keyboard/journey/JourneyCategoryDetailsActivity.kt
index 24d1489..f9aa02a 100644
--- a/app/src/main/java/com/keyboard/journey/JourneyCategoryDetailsActivity.kt
+++ b/app/src/main/java/com/keyboard/journey/JourneyCategoryDetailsActivity.kt
@@ -36,7 +36,7 @@ class JourneyCategoryDetailsActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
binding = JourneyCategoryDetailsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
- AdManager.showAD(this@JourneyCategoryDetailsActivity){
+ AdManager.showAD(this@JourneyCategoryDetailsActivity) {
}
bean = intent.getSerializableExtra(CATEGORY_DETAILS_BEAN_KEY) as MainDataBean?
@@ -48,6 +48,7 @@ class JourneyCategoryDetailsActivity : AppCompatActivity() {
initData()
+ AdManager.loadAllAd()
}
private fun initBar() {
@@ -65,7 +66,7 @@ class JourneyCategoryDetailsActivity : AppCompatActivity() {
binding.refreshLayout.setOnLoadMoreListener {
refreshData()
}
- adapter = CategoryDetailsDataAdapter(this, contentBeans)
+ adapter = CategoryDetailsDataAdapter(this, contentBeans, "category")
binding.rv.layoutManager = GridLayoutManager(this, 2)
binding.rv.adapter = adapter
}
@@ -123,7 +124,7 @@ class JourneyCategoryDetailsActivity : AppCompatActivity() {
})
}
- private fun loadingPlay(){
+ private fun loadingPlay() {
binding.loadingLayout.visibility = View.VISIBLE
val pagFile = PAGFile.Load(assets, "loading.pag")
binding.pagView.composition = pagFile
@@ -131,9 +132,9 @@ class JourneyCategoryDetailsActivity : AppCompatActivity() {
binding.pagView.play()
}
- private fun loadingClose(){
+ private fun loadingClose() {
binding.loadingLayout.visibility = View.GONE
- if(binding.pagView.isPlaying){
+ if (binding.pagView.isPlaying) {
binding.pagView.stop()
}
}
diff --git a/app/src/main/java/com/keyboard/journey/JourneyDetailsActivity.kt b/app/src/main/java/com/keyboard/journey/JourneyDetailsActivity.kt
index 9234828..8f3ec38 100644
--- a/app/src/main/java/com/keyboard/journey/JourneyDetailsActivity.kt
+++ b/app/src/main/java/com/keyboard/journey/JourneyDetailsActivity.kt
@@ -16,11 +16,14 @@ import com.keyboard.journey.util.OnDownloadListener
import com.keyboard.journey.util.ResourceDownloadUtil
import com.keyboard.journey.util.fileIsDownload
import com.keyboard.journey.util.loadRoundedImage
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import org.libpag.PAGFile
class JourneyDetailsActivity : AppCompatActivity(), OnDownloadListener {
companion object {
const val KEY_JOURNEY_DETAILS_BEAN = "key_journey_details_bean"
+ const val KEY_JOURNEY_FROM = "key_journey_from"
}
private lateinit var binding: JourneyDetailsActivityBinding
@@ -33,6 +36,10 @@ class JourneyDetailsActivity : AppCompatActivity(), OnDownloadListener {
binding = JourneyDetailsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
bean = intent.getSerializableExtra(KEY_JOURNEY_DETAILS_BEAN) as ItemDataBean?
+ val from = intent.getStringExtra(KEY_JOURNEY_FROM)
+ if (from == "like") {
+ AdManager.showAD(this) {}
+ }
initBar()
initView()
initData()
@@ -47,6 +54,32 @@ class JourneyDetailsActivity : AppCompatActivity(), OnDownloadListener {
}
private fun initView() {
+ GlobalScope.launch {
+ val current = JourneyApp.databaseManager.getItemDataBeanFileByPath(bean?.key!!)
+ if (current?.isLiked == true) {
+ binding.likeImg.setImageResource(R.drawable.like_select_icon)
+ } else {
+ binding.likeImg.setImageResource(R.drawable.like_unselect_icon)
+ }
+ bean?.isLiked = current?.isLiked == true
+ }
+
+ binding.likeBtn.setOnClickListener {
+ bean?.isLiked = bean?.isLiked != true
+ if (bean?.isLiked == true) {
+ binding.likeImg.setImageResource(R.drawable.like_select_icon)
+ } else {
+ binding.likeImg.setImageResource(R.drawable.like_unselect_icon)
+ }
+ GlobalScope.launch {
+ if (bean?.isLiked == true) {
+ JourneyApp.databaseManager.insertItemDataBeanFile(bean!!)
+ } else {
+ JourneyApp.databaseManager.deleteItemDataBeanFile(bean!!)
+ }
+ }
+ }
+
binding.titleTv.text = bean?.title
binding.backBtn.setOnClickListener { finish() }
@@ -58,8 +91,8 @@ class JourneyDetailsActivity : AppCompatActivity(), OnDownloadListener {
val imageUrl = it.themeContent.androidRawZipUrl
val b = fileIsDownload(this, imageUrl)
if (b) {
- AdManager.showAD(this@JourneyDetailsActivity){type->
- if (type == AdManager.type_show_close || type == AdManager.type_show_fail || type == AdManager.type_no_cache){
+ AdManager.showAD(this@JourneyDetailsActivity) { type ->
+ if (type == AdManager.type_show_close || type == AdManager.type_show_fail || type == AdManager.type_no_cache) {
AppSharedPreferences(this).setCurrentlyThemeUrl(imageUrl)
val intent = Intent(this, PreviewActivity::class.java)
intent.putExtra(PreviewActivity.KEY_PREVIEW_URL, imageUrl)
@@ -152,5 +185,19 @@ class JourneyDetailsActivity : AppCompatActivity(), OnDownloadListener {
binding.downIcon.visibility = View.GONE
updateUi(detailsBean!!)
+ val imageUrl = detailsBean?.themeContent?.androidRawZipUrl
+ val b = fileIsDownload(this, imageUrl!!)
+ if (b) {
+ AdManager.showAD(this@JourneyDetailsActivity) { type ->
+ if (type == AdManager.type_show_close || type == AdManager.type_show_fail || type == AdManager.type_no_cache) {
+ AppSharedPreferences(this).setCurrentlyThemeUrl(imageUrl)
+ val intent = Intent(this, PreviewActivity::class.java)
+ intent.putExtra(PreviewActivity.KEY_PREVIEW_URL, imageUrl)
+ startActivity(intent)
+ finish()
+ }
+ }
+
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keyboard/journey/JourneyStartActivity.kt b/app/src/main/java/com/keyboard/journey/JourneyStartActivity.kt
index 345d666..43b4657 100644
--- a/app/src/main/java/com/keyboard/journey/JourneyStartActivity.kt
+++ b/app/src/main/java/com/keyboard/journey/JourneyStartActivity.kt
@@ -38,7 +38,7 @@ class JourneyStartActivity : AppCompatActivity() {
private fun startMain() {
- val intent = Intent(this, JourneyMActivity::class.java)
+ val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
diff --git a/app/src/main/java/com/keyboard/journey/LikeFragment.kt b/app/src/main/java/com/keyboard/journey/LikeFragment.kt
new file mode 100644
index 0000000..cba963d
--- /dev/null
+++ b/app/src/main/java/com/keyboard/journey/LikeFragment.kt
@@ -0,0 +1,100 @@
+package com.keyboard.journey
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import com.gyf.immersionbar.ktx.immersionBar
+import com.keyboard.journey.adapter.CategoryDetailsDataAdapter
+import com.keyboard.journey.bean.ItemDataBean
+import com.keyboard.journey.databinding.FragmentLikeBinding
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+import org.libpag.PAGFile
+
+class LikeFragment : Fragment() {
+ private lateinit var binding: FragmentLikeBinding
+ private var adapter: CategoryDetailsDataAdapter? = null
+ private var contentBeans: MutableList = mutableListOf()
+
+
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+ ): View {
+ binding = FragmentLikeBinding.inflate(layoutInflater)
+ return binding.root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ initView()
+ initData()
+ }
+
+ private fun initImmersionBar() {
+ immersionBar {
+ statusBarDarkFont(true)
+ statusBarView(binding.view)
+ }
+ }
+
+ override fun onResume() {
+ super.onResume()
+ initImmersionBar()
+ initData()
+ }
+
+ override fun onHiddenChanged(hidden: Boolean) {
+ super.onHiddenChanged(hidden)
+ if (!hidden) {
+ initImmersionBar()
+ }
+ }
+
+
+ private fun initView() {
+ adapter = CategoryDetailsDataAdapter(requireActivity(), contentBeans, "like")
+ binding.rv.layoutManager = GridLayoutManager(requireActivity(), 2)
+ binding.rv.adapter = adapter
+ }
+
+ private fun initData() {
+ loadingPlay()
+ binding.noDataLayout.visibility = View.GONE
+ GlobalScope.launch {
+ val beans = JourneyApp.databaseManager.getAllItemDataBeanFiles()
+ if (beans.isNotEmpty()) {
+ contentBeans.clear()
+ contentBeans.addAll(beans)
+ withContext(Dispatchers.Main) {
+ loadingClose()
+ binding.noDataLayout.visibility = View.GONE
+ }
+ } else {
+ withContext(Dispatchers.Main) {
+ loadingClose()
+ binding.noDataLayout.visibility = View.VISIBLE
+ }
+ }
+ }
+ }
+
+ private fun loadingPlay() {
+ binding.loadingLayout.visibility = View.VISIBLE
+ val pagFile = PAGFile.Load(requireActivity().assets, "loading.pag")
+ binding.pagView.composition = pagFile
+ binding.pagView.setRepeatCount(0)
+ binding.pagView.play()
+ }
+
+ private fun loadingClose() {
+ binding.loadingLayout.visibility = View.GONE
+ if (binding.pagView.isPlaying) {
+ binding.pagView.stop()
+ }
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keyboard/journey/MainActivity.kt b/app/src/main/java/com/keyboard/journey/MainActivity.kt
new file mode 100644
index 0000000..c976327
--- /dev/null
+++ b/app/src/main/java/com/keyboard/journey/MainActivity.kt
@@ -0,0 +1,347 @@
+package com.keyboard.journey
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.graphics.Color
+import android.graphics.drawable.ColorDrawable
+import android.net.Uri
+import android.os.Bundle
+import android.provider.Settings
+import android.view.LayoutInflater
+import android.view.View
+import android.view.inputmethod.InputMethodManager
+import android.widget.ImageView
+import android.widget.LinearLayout
+import android.widget.TextView
+import android.widget.Toast
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.GravityCompat
+import androidx.drawerlayout.widget.DrawerLayout
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
+import com.bumptech.glide.Glide
+import com.gyf.immersionbar.ktx.immersionBar
+import com.keyboard.journey.bean.ItemDataBean
+import com.keyboard.journey.databinding.ActivityMainBinding
+import com.keyboard.journey.topon.AdManager
+import com.keyboard.journey.util.isMyInputMethodDefault
+import com.keyboard.journey.util.isMyInputMethodEnabled
+import com.keyboard.journey.util.openGooglePlayForReview
+import com.keyboard.journey.util.shareAppInfo
+
+
+class MainActivity : AppCompatActivity() {
+ private lateinit var binding: ActivityMainBinding
+ private var backPressedOnce = false
+ private lateinit var bannerStr0: String
+ private lateinit var bannerStr1: String
+
+ private val mFragments: MutableList = ArrayList()
+ private var currentIndex: Int = 0
+ private var mCurrentFragment: Fragment? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ bannerStr0 = getString(R.string.recommend)
+ bannerStr1 = getString(R.string.cool)
+ initBar()
+ initView()
+ registerReceiver()
+ AdManager.loadAllAd()
+ }
+
+ private fun initFragment() {
+ mFragments.clear()
+ mFragments.add(HomeFragment())
+ mFragments.add(LikeFragment())
+ changeFragment(0)
+ updateBtnState(0)
+ }
+
+ private fun changeFragment(index: Int) {
+ currentIndex = index
+ val ft: FragmentTransaction = supportFragmentManager.beginTransaction()
+ if (null != mCurrentFragment) {
+ ft.hide(mCurrentFragment!!)
+ }
+ var fragment = supportFragmentManager.findFragmentByTag(
+ mFragments[currentIndex].javaClass.name
+ )
+ if (null == fragment) {
+ fragment = mFragments[index]
+ }
+ mCurrentFragment = fragment
+
+ if (!fragment.isAdded) {
+ ft.add(R.id.frame_layout, fragment, fragment.javaClass.name)
+ } else {
+ ft.show(fragment)
+ }
+ ft.commit()
+ }
+
+ private fun updateBtnState(index: Int) {
+ binding.apply {
+ homeImg.setImageResource(
+ when (index) {
+ 0 -> {
+ binding.topLayout.visibility = View.VISIBLE
+ R.drawable.kj_home_select_icon
+ }
+
+ else -> R.drawable.kj_home_unselect_icon
+ }
+ )
+ likeImg.setImageResource(
+ when (index) {
+ 1 -> {
+ binding.topLayout.visibility = View.GONE
+ R.drawable.kj_like_select_icon
+ }
+
+ else -> R.drawable.kj_like_unselect_icon
+ }
+ )
+ }
+ }
+
+ 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.homeBtn.setOnClickListener {
+ changeFragment(0)
+ updateBtnState(0)
+ }
+ binding.likeBtn.setOnClickListener {
+ changeFragment(1)
+ updateBtnState(1)
+ }
+ 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.step1HomeBtn.setOnClickListener {
+ val intent = Intent(Settings.ACTION_INPUT_METHOD_SETTINGS)
+ startActivity(intent)
+ }
+
+ binding.step2HomeBtn.setOnClickListener {
+ val imeManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
+ imeManager.showInputMethodPicker()
+ }
+
+ binding.dialogStepLayout.setOnClickListener {
+ binding.dialogStepLayout.visibility = View.GONE
+ }
+
+ binding.dialogHomeStepLayout.setOnClickListener {
+ binding.dialogHomeStepLayout.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)
+ }
+ binding.rateBtn.setOnClickListener {
+ openGooglePlayForReview(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() {
+ val enabled = isMyInputMethodEnabled(this)
+ val default = isMyInputMethodDefault(this)
+ if (!enabled || !default) {
+ binding.dialogHomeStepLayout.visibility = View.VISIBLE
+ updateSetMyInputMethodHome()
+ }
+
+ initFragment()
+ setupDrawerListener()
+ initClick()
+ }
+
+ 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"))
+ }
+ }
+
+ private fun updateSetMyInputMethodHome() {
+ val enabled = isMyInputMethodEnabled(this)
+ val default = isMyInputMethodDefault(this)
+ if (enabled) {
+ binding.step1HomeBtn.background = getDrawable(R.drawable.drw_gray_select_bg)
+ binding.step1HomeBtn.text = "Step 1:Enabled"
+ binding.step1HomeBtn.setTextColor(Color.parseColor("#999999"))
+ } else {
+ binding.step1HomeBtn.background = getDrawable(R.mipmap.activate_btn_bg)
+ binding.step1HomeBtn.text = "Step 1:Select"
+ binding.step1HomeBtn.setTextColor(Color.parseColor("#000000"))
+ }
+ if (default) {
+ binding.step2HomeBtn.background = getDrawable(R.drawable.drw_gray_select_bg)
+ binding.step2HomeBtn.text = "Step 2:Enabled"
+ binding.step1HomeBtn.setTextColor(Color.parseColor("#999999"))
+ } else {
+ binding.step2HomeBtn.background = getDrawable(R.mipmap.activate_btn_bg)
+ binding.step2HomeBtn.text = "Step 2:Select"
+ binding.step1HomeBtn.setTextColor(Color.parseColor("#000000"))
+ }
+ }
+
+
+ private fun showDialogRecommend() {
+ val bean = ItemDataBean(
+ isLiked = false,
+ key = "225e68e251874193a884d7dd4b718586",
+ title = "AIGC Pretty Heart Girl",
+ type = 6,
+ thumbUrl = "https://cdn.kikakeyboard.com/picture/wallpaper/1705373685197_keyboard_preview_604*444.jpg.webp",
+ thumbUrlGif = ""
+ )
+
+ val inflater = LayoutInflater.from(this)
+ val dialogView = inflater.inflate(R.layout.dialog_recommend, null)
+ val okBtn = dialogView.findViewById(R.id.go_btn)
+ val cancelBtn = dialogView.findViewById(R.id.cha_btn)
+ val img = dialogView.findViewById(R.id.img)
+ Glide.with(this)
+ .load(bean.thumbUrl)
+ .into(img)
+ val dialogBuilder = AlertDialog.Builder(this).setView(dialogView)
+ val dialog = dialogBuilder.create()
+ dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
+ dialog.show()
+ okBtn.setOnClickListener {
+ dialog.dismiss()
+ val intent = Intent(this, JourneyDetailsActivity::class.java)
+ intent.putExtra(JourneyDetailsActivity.KEY_JOURNEY_DETAILS_BEAN, bean)
+ startActivity(intent)
+ }
+ cancelBtn.setOnClickListener {
+ dialog.dismiss()
+ }
+ }
+
+ private var receiver: BroadcastReceiver? = null
+ private fun registerReceiver() {
+ val filter = IntentFilter(Intent.ACTION_INPUT_METHOD_CHANGED)
+ receiver = object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ updateSetMyInputMethodHome()
+ val enabled = isMyInputMethodEnabled(this@MainActivity)
+ val default = isMyInputMethodDefault(this@MainActivity)
+ if (enabled && default) {
+ binding.dialogHomeStepLayout.visibility = View.GONE
+ showDialogRecommend()
+ } else {
+ binding.dialogHomeStepLayout.visibility = View.VISIBLE
+ }
+ }
+ }
+ registerReceiver(receiver, filter)
+ }
+
+ private fun unregisterReceiver() {
+ if (receiver != null) {
+ unregisterReceiver(receiver)
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ unregisterReceiver()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keyboard/journey/PreviewActivity.kt b/app/src/main/java/com/keyboard/journey/PreviewActivity.kt
index 769de96..e76f6d7 100644
--- a/app/src/main/java/com/keyboard/journey/PreviewActivity.kt
+++ b/app/src/main/java/com/keyboard/journey/PreviewActivity.kt
@@ -14,6 +14,7 @@ import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity
import com.gyf.immersionbar.ktx.immersionBar
import com.keyboard.journey.databinding.JourneyPreviewActivityBinding
+import com.keyboard.journey.topon.AdManager
import com.keyboard.journey.util.currentlyThemeUFileString
import com.keyboard.journey.util.getBitmapXXDrawable
import com.keyboard.journey.util.isMyInputMethodDefault
@@ -159,6 +160,7 @@ class PreviewActivity : AppCompatActivity() {
override fun onDestroy() {
super.onDestroy()
unregisterReceiver()
+ AdManager.loadAllAd()
}
private fun showKeyboard(view: View) {
diff --git a/app/src/main/java/com/keyboard/journey/adapter/CategoryDetailsDataAdapter.kt b/app/src/main/java/com/keyboard/journey/adapter/CategoryDetailsDataAdapter.kt
index f64b3f5..5902ab2 100644
--- a/app/src/main/java/com/keyboard/journey/adapter/CategoryDetailsDataAdapter.kt
+++ b/app/src/main/java/com/keyboard/journey/adapter/CategoryDetailsDataAdapter.kt
@@ -15,8 +15,13 @@ import com.keyboard.journey.bean.ItemDataBean
import com.keyboard.journey.bean.MainDataBean
import com.keyboard.journey.databinding.AdapterCategoryDetailsItemBinding
import com.keyboard.journey.databinding.MainRvItemBinding
+import com.keyboard.journey.topon.AdManager
-class CategoryDetailsDataAdapter(private val context: Context, private val mainDataList: List) :
+class CategoryDetailsDataAdapter(
+ private val context: Context,
+ private val mainDataList: List,
+ private val from: String
+) :
RecyclerView.Adapter() {
inner class MainDataViewHolder(private val binding: AdapterCategoryDetailsItemBinding) :
@@ -49,7 +54,8 @@ class CategoryDetailsDataAdapter(private val context: Context, private val mainD
holder.bind(currentItem)
holder.itemView.setOnClickListener {
val intent = Intent(context, JourneyDetailsActivity::class.java)
- intent.putExtra(JourneyDetailsActivity.KEY_JOURNEY_DETAILS_BEAN,currentItem)
+ intent.putExtra(JourneyDetailsActivity.KEY_JOURNEY_DETAILS_BEAN, currentItem)
+ intent.putExtra(JourneyDetailsActivity.KEY_JOURNEY_FROM, from)
context.startActivity(intent)
}
}
diff --git a/app/src/main/java/com/keyboard/journey/adapter/CategoryItemDataAdapter.kt b/app/src/main/java/com/keyboard/journey/adapter/CategoryItemDataAdapter.kt
index 73df8f9..234f5b6 100644
--- a/app/src/main/java/com/keyboard/journey/adapter/CategoryItemDataAdapter.kt
+++ b/app/src/main/java/com/keyboard/journey/adapter/CategoryItemDataAdapter.kt
@@ -2,6 +2,7 @@ package com.keyboard.journey.adapter
import android.content.Context
import android.content.Intent
+import android.util.Log
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
@@ -48,6 +49,7 @@ class CategoryItemDataAdapter(
val currentItem = mainDataList[position]
holder.bind(currentItem)
holder.itemView.setOnClickListener {
+ Log.d("ocean","currentItem ->$currentItem")
val intent = Intent(context, JourneyDetailsActivity::class.java)
intent.putExtra(KEY_JOURNEY_DETAILS_BEAN,currentItem)
context.startActivity(intent)
diff --git a/app/src/main/java/com/keyboard/journey/bean/ItemDataBean.kt b/app/src/main/java/com/keyboard/journey/bean/ItemDataBean.kt
index 50c4437..3899187 100644
--- a/app/src/main/java/com/keyboard/journey/bean/ItemDataBean.kt
+++ b/app/src/main/java/com/keyboard/journey/bean/ItemDataBean.kt
@@ -1,14 +1,22 @@
package com.keyboard.journey.bean
+import androidx.annotation.Keep
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
import java.io.Serializable
+@Keep
+@Entity
data class ItemDataBean(
- val key: String,
- val title: String,
- val type: Int,
- val thumbUrl: String,
- val thumbUrlGif: String,
- val themeContentBean: ThemeContentBean,
- val lockBean: LockBean
-) : Serializable
+ @ColumnInfo(name = "isLiked") var isLiked: Boolean,
+ @ColumnInfo(name = "key") var key: String,
+ @ColumnInfo(name = "title") var title: String,
+ @ColumnInfo(name = "type") var type: Int,
+ @ColumnInfo(name = "thumbUrl") var thumbUrl: String,
+ @ColumnInfo(name = "thumbUrlGif") var thumbUrlGif: String,
+) : Serializable {
+ @PrimaryKey(autoGenerate = true)
+ var id: Long = 0
+}
diff --git a/app/src/main/java/com/keyboard/journey/db/DatabaseManager.kt b/app/src/main/java/com/keyboard/journey/db/DatabaseManager.kt
new file mode 100644
index 0000000..bcd8841
--- /dev/null
+++ b/app/src/main/java/com/keyboard/journey/db/DatabaseManager.kt
@@ -0,0 +1,80 @@
+package com.keyboard.journey.db
+
+import android.content.Context
+import androidx.room.Room
+import com.keyboard.journey.bean.ItemDataBean
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.withContext
+
+class DatabaseManager private constructor(context: Context) {
+
+ private val database = Room.databaseBuilder(
+ context.applicationContext,
+ LikeDatabase::class.java, "local_kj_like_database"
+ ).build()
+
+ private val audioFileDao = database.localLikeDao()
+
+ suspend fun insertItemDataBeanFile(audio: ItemDataBean) {
+ withContext(Dispatchers.IO) {
+ val existingItemDataBeanFile = getItemDataBeanFileByPath(audio.key)
+ if (existingItemDataBeanFile == null) {
+ audioFileDao.insertItemDataBeanFile(audio)
+ } else {
+ audioFileDao.updateItemDataBeanFile(audio)
+ }
+ }
+ }
+
+ suspend fun insertItemDataBeanFiles(audios: List) {
+ withContext(Dispatchers.IO) {
+ for (audio in audios) {
+ val existingItemDataBeanFile = getItemDataBeanFileByPath(audio.key)
+ if (existingItemDataBeanFile == null) {
+ audioFileDao.insertItemDataBeanFile(audio)
+ } else {
+ audioFileDao.updateItemDataBeanFile(audio)
+ }
+ }
+ }
+ }
+
+ suspend fun getAllItemDataBeanFiles(): List {
+ return withContext(Dispatchers.IO) {
+ audioFileDao.getAllItemDataBeanFile()
+ }
+ }
+
+ suspend fun deleteItemDataBeanFile(audioFile: ItemDataBean) {
+ withContext(Dispatchers.IO) {
+ audioFileDao.deleteItemDataBeanFile(audioFile)
+ }
+ }
+
+ suspend fun deleteAllItemDataBeanFiles() {
+ withContext(Dispatchers.IO) {
+ audioFileDao.deleteAllItemDataBeanFile()
+ }
+ }
+
+ suspend fun updateItemDataBeanFiles(audioFile: ItemDataBean) {
+ withContext(Dispatchers.IO) {
+ audioFileDao.updateItemDataBeanFile(audioFile)
+ }
+ }
+
+ suspend fun getItemDataBeanFileByPath(path: String): ItemDataBean? {
+ return audioFileDao.getItemDataBeanFileByPath(path)
+ }
+
+ companion object {
+ @Volatile
+ private var instance: DatabaseManager? = null
+
+ fun getInstance(context: Context): DatabaseManager {
+ return instance ?: synchronized(this) {
+ instance ?: DatabaseManager(context).also { instance = it }
+ }
+ }
+ }
+}
diff --git a/app/src/main/java/com/keyboard/journey/db/LikeDatabase.kt b/app/src/main/java/com/keyboard/journey/db/LikeDatabase.kt
new file mode 100644
index 0000000..3f9be77
--- /dev/null
+++ b/app/src/main/java/com/keyboard/journey/db/LikeDatabase.kt
@@ -0,0 +1,11 @@
+
+package com.keyboard.journey.db
+
+import androidx.room.Database
+import androidx.room.RoomDatabase
+import com.keyboard.journey.bean.ItemDataBean
+
+@Database(entities = [ItemDataBean::class], version = 1, exportSchema = false)
+abstract class LikeDatabase : RoomDatabase() {
+ abstract fun localLikeDao(): LocalLikeDao
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/keyboard/journey/db/LocalLikeDao.kt b/app/src/main/java/com/keyboard/journey/db/LocalLikeDao.kt
new file mode 100644
index 0000000..9395db7
--- /dev/null
+++ b/app/src/main/java/com/keyboard/journey/db/LocalLikeDao.kt
@@ -0,0 +1,31 @@
+
+
+package com.keyboard.journey.db
+
+import androidx.room.*
+import com.keyboard.journey.bean.ItemDataBean
+
+@Dao
+interface LocalLikeDao {
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insertItemDataBeanFile(barcode: ItemDataBean)
+
+ @Insert(onConflict = OnConflictStrategy.REPLACE)
+ suspend fun insertItemDataBeanFiles(itemDataBeans: List)
+
+ @Query("SELECT * FROM ItemDataBean")
+ suspend fun getAllItemDataBeanFile(): List
+
+ @Delete
+ suspend fun deleteItemDataBeanFile(barcode: ItemDataBean)
+
+ @Query("DELETE FROM ItemDataBean")
+ suspend fun deleteAllItemDataBeanFile()
+
+ @Update
+ suspend fun updateItemDataBeanFile(itemDataBean: ItemDataBean)
+
+ @Query("SELECT * FROM ItemDataBean WHERE `key` = :path LIMIT 1")
+ suspend fun getItemDataBeanFileByPath(path: String): ItemDataBean?
+}
diff --git a/app/src/main/java/com/keyboard/journey/util/AppUtil.kt b/app/src/main/java/com/keyboard/journey/util/AppUtil.kt
index 6cebd65..9552c97 100644
--- a/app/src/main/java/com/keyboard/journey/util/AppUtil.kt
+++ b/app/src/main/java/com/keyboard/journey/util/AppUtil.kt
@@ -232,3 +232,18 @@ fun shareAppInfo(context: Context) {
context.startActivity(shareIntent)
}
}
+
+fun openGooglePlayForReview(context: Context) {
+ val packageName = context.packageName
+ try {
+ val intent = Intent(
+ Intent.ACTION_VIEW,
+ Uri.parse("https://play.google.com/store/apps/details?id=$packageName")
+ )
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(intent)
+ } catch (e: Exception) {
+ // 如果设备上没有安装 Google Play 商店应用,则使用浏览器打开
+ e.printStackTrace()
+ }
+}
diff --git a/app/src/main/java/com/keyboard/journey/util/NetworkUtil.kt b/app/src/main/java/com/keyboard/journey/util/NetworkUtil.kt
index 351e78e..4acde1c 100644
--- a/app/src/main/java/com/keyboard/journey/util/NetworkUtil.kt
+++ b/app/src/main/java/com/keyboard/journey/util/NetworkUtil.kt
@@ -1,5 +1,6 @@
package com.keyboard.journey.util
+import com.keyboard.journey.JourneyApp
import com.keyboard.journey.bean.Author
import com.keyboard.journey.bean.CategoryDataBean
import com.keyboard.journey.bean.Content
@@ -10,6 +11,8 @@ import com.keyboard.journey.bean.MainDataBean
import com.keyboard.journey.bean.MainItemDataBean
import com.keyboard.journey.bean.ThemeContentBean
import com.keyboard.journey.bean.ThemeDetailsContent
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
import okhttp3.Call
import okhttp3.Callback
import okhttp3.OkHttpClient
@@ -189,13 +192,12 @@ class NetworkUtil {
val lock = LockBean(lockType)
val item = ItemDataBean(
+ false,
itemKey,
itemTitle,
itemType,
thumbUrl,
thumbUrlGif,
- themeContent,
- lock
)
itemsList.add(item)
}
diff --git a/app/src/main/res/drawable/arrow_down_icon.xml b/app/src/main/res/drawable/arrow_down_icon.xml
new file mode 100644
index 0000000..c71a8a9
--- /dev/null
+++ b/app/src/main/res/drawable/arrow_down_icon.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/cha_icon.xml b/app/src/main/res/drawable/cha_icon.xml
new file mode 100644
index 0000000..3077880
--- /dev/null
+++ b/app/src/main/res/drawable/cha_icon.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/draw_go_2_bg.xml b/app/src/main/res/drawable/draw_go_2_bg.xml
new file mode 100644
index 0000000..60daee0
--- /dev/null
+++ b/app/src/main/res/drawable/draw_go_2_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/draw_go_bg.xml b/app/src/main/res/drawable/draw_go_bg.xml
new file mode 100644
index 0000000..fb014b3
--- /dev/null
+++ b/app/src/main/res/drawable/draw_go_bg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/draw_main_tab_bg.xml b/app/src/main/res/drawable/draw_main_tab_bg.xml
new file mode 100644
index 0000000..bb7f300
--- /dev/null
+++ b/app/src/main/res/drawable/draw_main_tab_bg.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/kj_home_select_icon.xml b/app/src/main/res/drawable/kj_home_select_icon.xml
new file mode 100644
index 0000000..9017f2e
--- /dev/null
+++ b/app/src/main/res/drawable/kj_home_select_icon.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/kj_home_unselect_icon.xml b/app/src/main/res/drawable/kj_home_unselect_icon.xml
new file mode 100644
index 0000000..7748385
--- /dev/null
+++ b/app/src/main/res/drawable/kj_home_unselect_icon.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/kj_like_select_icon.xml b/app/src/main/res/drawable/kj_like_select_icon.xml
new file mode 100644
index 0000000..7efb1ed
--- /dev/null
+++ b/app/src/main/res/drawable/kj_like_select_icon.xml
@@ -0,0 +1,14 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/kj_like_unselect_icon.xml b/app/src/main/res/drawable/kj_like_unselect_icon.xml
new file mode 100644
index 0000000..1715a53
--- /dev/null
+++ b/app/src/main/res/drawable/kj_like_unselect_icon.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/like_select_icon.xml b/app/src/main/res/drawable/like_select_icon.xml
new file mode 100644
index 0000000..73b9de8
--- /dev/null
+++ b/app/src/main/res/drawable/like_select_icon.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/like_unselect_icon.xml b/app/src/main/res/drawable/like_unselect_icon.xml
new file mode 100644
index 0000000..7c1b745
--- /dev/null
+++ b/app/src/main/res/drawable/like_unselect_icon.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..49bd9a3
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,443 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_recommend.xml b/app/src/main/res/layout/dialog_recommend.xml
new file mode 100644
index 0000000..304bc69
--- /dev/null
+++ b/app/src/main/res/layout/dialog_recommend.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_like.xml b/app/src/main/res/layout/fragment_like.xml
new file mode 100644
index 0000000..e539949
--- /dev/null
+++ b/app/src/main/res/layout/fragment_like.xml
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/journey_activity_main.xml b/app/src/main/res/layout/journey_activity_main.xml
index fd51cc1..1067654 100644
--- a/app/src/main/res/layout/journey_activity_main.xml
+++ b/app/src/main/res/layout/journey_activity_main.xml
@@ -1,5 +1,5 @@
-
-
+ android:background="@drawable/draw_go_bg">
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/journey_details_activity.xml b/app/src/main/res/layout/journey_details_activity.xml
index 498e9d9..baa2f3b 100644
--- a/app/src/main/res/layout/journey_details_activity.xml
+++ b/app/src/main/res/layout/journey_details_activity.xml
@@ -43,13 +43,30 @@
+
+
+
+
+
+
+
+ android:textSize="14sp" />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
Applied
%s %%
Preview
+ My Favorite
\ No newline at end of file