From 69cace8f650c160892e607c1234d2faa224bb417 Mon Sep 17 00:00:00 2001 From: lee_spring Date: Mon, 20 May 2024 13:52:20 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0=E5=BA=94=E7=94=A8=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=202.=E4=BC=98=E5=8C=96=E9=83=A8=E5=88=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/deploymentTargetDropDown.xml | 15 +-- .idea/other.xml | 6 + app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 10 +- .../wordunlock/FloatingWordInputService.kt | 117 ------------------ .../Fragment/FavoriteListActivity.kt | 2 +- .../wordunlock/Fragment/SettingsFragment.kt | 25 ++++ .../wordunlock/WordUnlockForegroundService.kt | 4 +- .../adapters/FavoriteItemViewHolder.kt | 6 +- .../adapters/FavoriteListAdapter.kt | 7 ++ .../wordunlock/interfaces/FavoriteItemDao.kt | 2 + .../res/drawable/baseline_check_circle_24.xml | 5 + .../baseline_check_circle_outline_24.xml | 5 + .../res/drawable/baseline_delete_sweep_24.xml | 5 + app/src/main/res/layout/collection_list.xml | 4 +- app/src/main/res/layout/float_word_input.xml | 2 +- app/src/main/res/menu/menu_main.xml | 4 +- .../main/res/mipmap-hdpi/ic_launcher_hdpi.png | Bin 0 -> 1172 bytes .../main/res/mipmap-mdpi/ic_launcher_mdpi.png | Bin 0 -> 833 bytes .../mipmap-mdpi/ic_launcher_mdpi_round.png | Bin 0 -> 1164 bytes .../res/mipmap-xhdpi/ic_launcher_xhdpi.png | Bin 0 -> 1554 bytes .../mipmap-xxxhdpi/ic_launcher_xxxhdpi.png | Bin 0 -> 3067 bytes app/src/main/res/navigation/nav_graph.xml | 4 +- app/src/main/res/values/strings.xml | 11 +- 24 files changed, 87 insertions(+), 153 deletions(-) create mode 100644 .idea/other.xml delete mode 100644 app/src/main/java/com/example/wordunlock/FloatingWordInputService.kt create mode 100644 app/src/main/res/drawable/baseline_check_circle_24.xml create mode 100644 app/src/main/res/drawable/baseline_check_circle_outline_24.xml create mode 100644 app/src/main/res/drawable/baseline_delete_sweep_24.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_hdpi.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_mdpi.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_mdpi_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_xhdpi.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_xxxhdpi.png diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 86a7806..0c0c338 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,20 +3,7 @@ - - - - - - - - - - - - - - + diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000..f3d4a2e --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index dd18bb4..9ae4b8d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -3,6 +3,7 @@ plugins { id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'dagger.hilt.android.plugin' + id 'kotlin-android' } android { @@ -70,8 +71,9 @@ configurations { dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:1.9.20" implementation 'androidx.core:core-ktx:1.8.0' - implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') + implementation platform('org.jetbrains.kotlin:kotlin-bom:1.9.20') implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.3.1' implementation 'androidx.activity:activity-compose:1.5.1' implementation platform('androidx.compose:compose-bom:2022.10.00') @@ -92,7 +94,7 @@ dependencies { debugImplementation 'androidx.compose.ui:ui-test-manifest' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation("androidx.compose.ui:ui:1.3.3") // 或者更高版本 + implementation("androidx.compose.ui:ui:1.5.4") // 或者更高版本 implementation("androidx.compose.material3:material3:1.0.1") // 或者更高版本 implementation("androidx.activity:activity-compose:1.6.1") // 或者更高版本 implementation 'com.github.princekin-f:EasyFloat:2.0.4' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a1434de..a4de281 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -20,9 +20,9 @@ android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" - android:icon="@mipmap/ic_launcher" + android:icon="@mipmap/ic_launcher_xxxhdpi" android:label="@string/app_name" - android:roundIcon="@mipmap/ic_launcher_round" + android:roundIcon="@mipmap/ic_launcher_xxxhdpi" android:supportsRtl="true" android:theme="@style/Theme.WordUnlock" tools:targetApi="31"> @@ -35,7 +35,9 @@ android:name=".WordUnlockForegroundService" android:enabled="true" android:exported="true" - android:theme="@style/AppTheme"/> + android:theme="@style/AppTheme"> + + diff --git a/app/src/main/java/com/example/wordunlock/FloatingWordInputService.kt b/app/src/main/java/com/example/wordunlock/FloatingWordInputService.kt deleted file mode 100644 index c7528a4..0000000 --- a/app/src/main/java/com/example/wordunlock/FloatingWordInputService.kt +++ /dev/null @@ -1,117 +0,0 @@ -package com.example.wordunlock - -import android.app.Service -import android.content.Context -import android.content.Intent -import android.graphics.PixelFormat -import android.os.IBinder -import android.view.* -import android.view.inputmethod.InputMethodManager -import androidx.compose.foundation.layout.* -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.focus.onFocusChanged -import androidx.compose.ui.platform.ComposeView -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.compose.ui.unit.dp -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleOwner -import androidx.lifecycle.LifecycleRegistry - - -class FloatingWordInputService : Service(),LifecycleOwner { - - private lateinit var windowManager: WindowManager - private lateinit var floatingView: View - private lateinit var lifecycleRegistry: LifecycleRegistry - - override fun onBind(intent: Intent): IBinder? { - return null - } - - override fun onCreate() { - super.onCreate() - - windowManager = getSystemService(WINDOW_SERVICE) as WindowManager - lifecycleRegistry = LifecycleRegistry(this) - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE) - - floatingView = createFloatingView() - - val params = createWindowParams() - - windowManager.addView(floatingView, params) - } - - override fun getLifecycle(): Lifecycle { - return lifecycleRegistry - } - - private fun createFloatingView(): View { - // 创建你的自定义悬浮窗视图 - // 例如,你可以使用Compose来创建一个悬浮窗 - return ComposeView(this).apply { - setContent { - WordInputView() - } - } - } - - @OptIn(ExperimentalMaterial3Api::class) - @Composable - fun WordInputView() { - var userInput by remember { mutableStateOf("") } - val context = LocalContext.current - val view = LocalView.current - - Column( - modifier = Modifier.fillMaxWidth().padding(16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Text(text = "单词:apple", style = MaterialTheme.typography.headlineMedium) // 替换为实际单词 - Text(text = "定义:苹果", style = MaterialTheme.typography.bodyMedium) // 替换为实际定义 - Spacer(modifier = Modifier.height(16.dp)) - TextField( - value = userInput, - onValueChange = { userInput = it }, - label = { Text("请输入单词") }, - modifier = Modifier.fillMaxWidth().onFocusChanged { focusState -> - if (focusState.isFocused) { - val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager - inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT) - } - } - ) - Spacer(modifier = Modifier.height(16.dp)) - Button(onClick = { /* 处理提交逻辑 */ }) { - Text("提交") - } - } - } - - private fun createWindowParams(): WindowManager.LayoutParams { - // 设置悬浮窗的参数 - return WindowManager.LayoutParams().apply { - width = WindowManager.LayoutParams.WRAP_CONTENT - height = WindowManager.LayoutParams.WRAP_CONTENT - gravity = Gravity.CENTER - flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or - WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or - WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - format = PixelFormat.TRANSLUCENT - type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY - } - } - - override fun onDestroy() { - super.onDestroy() - lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY) - windowManager.removeView(floatingView) - } -} - - diff --git a/app/src/main/java/com/example/wordunlock/Fragment/FavoriteListActivity.kt b/app/src/main/java/com/example/wordunlock/Fragment/FavoriteListActivity.kt index b70710f..cd1d002 100644 --- a/app/src/main/java/com/example/wordunlock/Fragment/FavoriteListActivity.kt +++ b/app/src/main/java/com/example/wordunlock/Fragment/FavoriteListActivity.kt @@ -35,7 +35,7 @@ class FavoriteListActivity : AppCompatActivity() { adapter = FavoriteListAdapter { item -> lifecycleScope.launch { // 在这里处理删除操作,例如调用DAO的delete方法 - // favoriteItemDao.delete(item) + item.id?.let { db.favoriteItemDao().deleteById(it) } } } recyclerView.adapter = adapter diff --git a/app/src/main/java/com/example/wordunlock/Fragment/SettingsFragment.kt b/app/src/main/java/com/example/wordunlock/Fragment/SettingsFragment.kt index 32a1c13..bdaa1c1 100644 --- a/app/src/main/java/com/example/wordunlock/Fragment/SettingsFragment.kt +++ b/app/src/main/java/com/example/wordunlock/Fragment/SettingsFragment.kt @@ -1,17 +1,42 @@ package com.example.wordunlock.Fragment +import android.app.AlertDialog import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView +import android.widget.Switch +import android.widget.Toast import androidx.fragment.app.Fragment import com.example.wordunlock.R class SettingsFragment : Fragment() { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater.inflate(R.layout.fragment_settings, container, false) + var forceMode = view.findViewById(R.id.switch_force_mode) + forceMode.setOnClickListener { + if (forceMode.isChecked) { + // 切换到强制模式 + // 显示提示信息 + //弹窗提示 + val toastMessage = "已开启强制模式。关闭后弹窗将有关闭按钮,需输入正确单词即可关闭" + AlertDialog.Builder(requireContext()) + .setTitle("开启强制模式") + .setMessage("开启后弹窗将无关闭按钮,需强制输入正确单词即可关闭。") + .setPositiveButton("确定") { dialog, _ -> + dialog.dismiss() + } + .setCancelable(false) // 避免用户点击外部关闭而不做处理 + .show() + } else { + // 切换到普通模式 + // 隐藏提示信息 + // ... + } + } + val collectionView = view.findViewById(R.id.image_view_favorites) collectionView.setOnClickListener { // 点击跳转到收藏夹页面 diff --git a/app/src/main/java/com/example/wordunlock/WordUnlockForegroundService.kt b/app/src/main/java/com/example/wordunlock/WordUnlockForegroundService.kt index 9ccd018..64d8d64 100644 --- a/app/src/main/java/com/example/wordunlock/WordUnlockForegroundService.kt +++ b/app/src/main/java/com/example/wordunlock/WordUnlockForegroundService.kt @@ -226,10 +226,10 @@ class WordUnlockForegroundService : IntentService("WordUnlockService"), TextToSp withContext(Dispatchers.IO) { saveFavoriteItem(item = favoriteItem) } - val goldenDrawable = ContextCompat.getDrawable(this, R.drawable.baseline_star_gold_24) + val goldenDrawable = ContextCompat.getDrawable(this, R.drawable.baseline_check_circle_24) starButton?.setImageDrawable(goldenDrawable) } else { - val normalDrawable = ContextCompat.getDrawable(this, R.drawable.baseline_star_24) + val normalDrawable = ContextCompat.getDrawable(this, R.drawable.baseline_check_circle_outline_24) starButton?.setImageDrawable(normalDrawable) withContext(Dispatchers.IO) { removeFavoriteItem(favoriteItem?.word) diff --git a/app/src/main/java/com/example/wordunlock/adapters/FavoriteItemViewHolder.kt b/app/src/main/java/com/example/wordunlock/adapters/FavoriteItemViewHolder.kt index 789a613..f91bf96 100644 --- a/app/src/main/java/com/example/wordunlock/adapters/FavoriteItemViewHolder.kt +++ b/app/src/main/java/com/example/wordunlock/adapters/FavoriteItemViewHolder.kt @@ -1,16 +1,20 @@ package com.example.wordunlock.adapters +import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView +import com.example.wordunlock.R import com.example.wordunlock.models.FavoriteItem import com.example.wordunlock.databinding.CollectionListBinding class FavoriteItemViewHolder(private val binding: CollectionListBinding) : RecyclerView.ViewHolder(binding.root) { + val ivDelete: ImageView = itemView.findViewById(R.id.iv_delete) + fun bind(favoriteItem: FavoriteItem, onDeleteClickListener: (FavoriteItem) -> Unit) { binding.tvWord.text = favoriteItem.word binding.ivDelete.setOnClickListener { - onDeleteClickListener.invoke(favoriteItem) + onDeleteClickListener(favoriteItem) } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/wordunlock/adapters/FavoriteListAdapter.kt b/app/src/main/java/com/example/wordunlock/adapters/FavoriteListAdapter.kt index 2794c87..c0a5fe9 100644 --- a/app/src/main/java/com/example/wordunlock/adapters/FavoriteListAdapter.kt +++ b/app/src/main/java/com/example/wordunlock/adapters/FavoriteListAdapter.kt @@ -6,10 +6,14 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import com.example.wordunlock.databinding.CollectionListBinding import com.example.wordunlock.models.FavoriteItem +import com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter class FavoriteListAdapter(private val onDeleteClickListener: (FavoriteItem) -> Unit) : ListAdapter(FavoriteItemDiffCallback()) { + var selectedPosition = -1 + val selectedItemOrNull: FavoriteItem? + get() = if (selectedPosition >= 0 && selectedPosition < itemCount) getItem(selectedPosition) else null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): FavoriteItemViewHolder { val binding = CollectionListBinding.inflate(LayoutInflater.from(parent.context), parent, false) return FavoriteItemViewHolder(binding) @@ -29,4 +33,7 @@ class FavoriteListAdapter(private val onDeleteClickListener: (FavoriteItem) -> U return oldItem == newItem } } + + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/wordunlock/interfaces/FavoriteItemDao.kt b/app/src/main/java/com/example/wordunlock/interfaces/FavoriteItemDao.kt index 8e1c0c6..1c2d5a8 100644 --- a/app/src/main/java/com/example/wordunlock/interfaces/FavoriteItemDao.kt +++ b/app/src/main/java/com/example/wordunlock/interfaces/FavoriteItemDao.kt @@ -24,4 +24,6 @@ interface FavoriteItemDao { @Query("DELETE FROM favorite_items WHERE word LIKE :word") suspend fun delete(word: String) + @Query("DELETE FROM favorite_items WHERE id LIKE :id") + suspend fun deleteById(id: Int) } \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_check_circle_24.xml b/app/src/main/res/drawable/baseline_check_circle_24.xml new file mode 100644 index 0000000..070cede --- /dev/null +++ b/app/src/main/res/drawable/baseline_check_circle_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_check_circle_outline_24.xml b/app/src/main/res/drawable/baseline_check_circle_outline_24.xml new file mode 100644 index 0000000..b6c1763 --- /dev/null +++ b/app/src/main/res/drawable/baseline_check_circle_outline_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_delete_sweep_24.xml b/app/src/main/res/drawable/baseline_delete_sweep_24.xml new file mode 100644 index 0000000..82cedd4 --- /dev/null +++ b/app/src/main/res/drawable/baseline_delete_sweep_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/collection_list.xml b/app/src/main/res/layout/collection_list.xml index 2cc6da9..c3bbf35 100644 --- a/app/src/main/res/layout/collection_list.xml +++ b/app/src/main/res/layout/collection_list.xml @@ -26,7 +26,9 @@ android:id="@+id/iv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:contentDescription="删除按钮" /> + android:contentDescription="删除按钮" + android:onClick="onDeleteButtonClicked" + android:src="@drawable/baseline_delete_sweep_24"/> \ No newline at end of file diff --git a/app/src/main/res/layout/float_word_input.xml b/app/src/main/res/layout/float_word_input.xml index f0b0572..e12882f 100644 --- a/app/src/main/res/layout/float_word_input.xml +++ b/app/src/main/res/layout/float_word_input.xml @@ -55,7 +55,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onStarButtonClicked" - android:src="@drawable/baseline_star_24" + android:src="@drawable/baseline_check_circle_outline_24" android:layout_weight="1"/> + android:title="取消全选"/> \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_hdpi.png b/app/src/main/res/mipmap-hdpi/ic_launcher_hdpi.png new file mode 100644 index 0000000000000000000000000000000000000000..af5dd137f7aa7078aba4b2fae54bb9bfcf25e512 GIT binary patch literal 1172 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 Wfl#EMPB_l$0P=SW({f|CNB;n6nYu^- literal 0 HcmV?d00001 diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index af2a112..085153c 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -8,13 +8,13 @@ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b36b72b..f57496f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,9 +1,8 @@ - WordUnlock - 辅助功能服务,用于解锁后学习单词 - dictionary - setting - 六级词汇 - checkAll + 弹词 + 开辅助功能服务,用于解锁后通过在桌面弹窗学习单词。提示:必须开启此服务,否则软件将缺失核心功能,本软件不会收集您的任何隐私。 + 词库 + 设置 + 全选 \ No newline at end of file