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