diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5386758..bbf055d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -25,17 +25,14 @@ android:supportsRtl="true" android:theme="@style/Theme.rust.Concept" android:usesCleartextTraffic="true" - android:screenOrientation="portrait" tools:targetApi="tiramisu"> + + android:launchMode="singleTask" + android:icon="@drawable/table" + android:taskAffinity="@string/code_table" + android:documentLaunchMode="intoExisting" + android:exported="false"> + diff --git a/app/src/main/java/com/coldmint/rust/pro/CodeTableActivity.kt b/app/src/main/java/com/coldmint/rust/pro/CodeTableActivity.kt index cc8154a..b94560e 100644 --- a/app/src/main/java/com/coldmint/rust/pro/CodeTableActivity.kt +++ b/app/src/main/java/com/coldmint/rust/pro/CodeTableActivity.kt @@ -13,6 +13,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.view.inputmethod.EditorInfo +import android.widget.Toast import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import com.coldmint.rust.core.database.code.CodeDataBase @@ -21,7 +22,6 @@ import com.coldmint.rust.core.database.code.SectionInfo import com.coldmint.rust.pro.adapters.CodeTableAdapter import com.coldmint.rust.pro.base.BaseActivity import com.coldmint.rust.pro.databinding.ActivityCodeTableBinding -import com.muqing.gj import java.util.concurrent.Executors class CodeTableActivity : BaseActivity() { @@ -38,11 +38,15 @@ class CodeTableActivity : BaseActivity() { override fun beforeTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) { } override fun onTextChanged(a: CharSequence?, p1: Int, p2: Int, p3: Int) { - if (a.isNullOrEmpty()) { +/* if (a.isNullOrEmpty()) { loadData() return } - loadData(a.toString()) + loadData(a.toString())*/ + if (a.isNullOrEmpty()) { + viewBinding.searchPick.isVisible = false + loadData() + } } override fun afterTextChanged(a: Editable?) { } @@ -51,8 +55,16 @@ class CodeTableActivity : BaseActivity() { if (p1 == EditorInfo.IME_ACTION_SEARCH) { if (v?.text.isNullOrEmpty()) { loadData() - }else - loadData(v?.text.toString()) + }else{ + var toString = v?.text.toString() + if (toString.startsWith("/")) { + toString = toString.substring(1) + loadData(toString) + }else{ + viewBinding.searchPick.isVisible = true + adapter.item?.search(toString) + } + } } false } @@ -86,6 +98,7 @@ class CodeTableActivity : BaseActivity() { * @param section String? 节 */ fun loadData(key: String? = null, section: String? = null) { + //如果 key start 有 / 则取后的string executorService.submit { filterMode = key != null || section != null val sectionMap = HashMap() @@ -175,7 +188,6 @@ class CodeTableActivity : BaseActivity() { spannableString.setSpan( object : ClickableSpan() { override fun onClick(p0: View) { - editisVisible(false) loadData() } }, start, start + action.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE @@ -195,63 +207,9 @@ class CodeTableActivity : BaseActivity() { return true } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.filter_units -> { - if (viewBinding.edittext.isVisible) { - if (viewBinding.edittext.text.isNullOrEmpty()) { - loadData() - } else { - loadData(viewBinding.edittext.text.toString()) - } - } else { - editisVisible(true) - } - /* - InputDialog(this).setTitle(R.string.filter).setMessage(R.string.filter_tip) - .setInputCanBeEmpty(false).setMaxNumber(20) - .setPositiveButton(R.string.dialog_ok) { text -> - var key = text - if (key.length > 20) { - key = key.substring(0, 20) - } - loadData(key) - true - }.setNegativeButton(R.string.dialog_close) { - - }.show()*/ - } - - android.R.id.home -> { - if (viewBinding.edittext.isVisible) { - editisVisible(false) - return true - } - ifNeedFinish() - return true - } - } - return super.onOptionsItemSelected(item) - } - - private fun editisVisible(b: Boolean) { - } - - @Deprecated("Deprecated in Java") override fun onBackPressed() { - if (viewBinding.expandableListView.adapter !is CodeTableAdapter) { - viewBinding.expandableListView.adapter = adapter - return - } - if (viewBinding.edittext.text.isNotEmpty()) { - viewBinding.edittext.setText("") - gj.ycjp(viewBinding.edittext) - } else { - gj.tcjp(viewBinding.edittext) finish() // ifNeedFinish() - } } override fun getViewBindingObject(layoutInflater: LayoutInflater): ActivityCodeTableBinding { return ActivityCodeTableBinding.inflate(layoutInflater) diff --git a/app/src/main/java/com/coldmint/rust/pro/MainActivity.kt b/app/src/main/java/com/coldmint/rust/pro/MainActivity.kt index 286504b..5c6fa72 100644 --- a/app/src/main/java/com/coldmint/rust/pro/MainActivity.kt +++ b/app/src/main/java/com/coldmint/rust/pro/MainActivity.kt @@ -1,8 +1,13 @@ package com.coldmint.rust.pro +import android.content.Context import android.content.Intent import android.content.pm.PackageInfo import android.content.pm.PackageManager +import android.content.pm.ShortcutInfo +import android.content.pm.ShortcutManager +import android.graphics.drawable.Icon +import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper @@ -42,6 +47,7 @@ import com.google.android.material.snackbar.Snackbar import com.google.gson.Gson import org.json.JSONObject import java.io.File +import java.util.Arrays import java.util.concurrent.Executors import java.util.zip.ZipEntry @@ -300,7 +306,34 @@ class MainActivity : BaseActivity() { }*/ codeTable.setOnMenuItemClickListener { - startActivity(Intent(this@MainActivity, CodeTableActivity::class.java)) +/* // 获取上下文,通常是Activity的this或者Application的getApplicationContext() + val context: Context = this@MainActivity // 假设在Activity内部 +// 创建Intent,指定目标Activity + val shortcutIntent = Intent(context, CodeTableActivity::class.java) + shortcutIntent.setAction("com.coldmint.rust.pro.ACTION_CODE_TABLE") // 自定义Action,可选 + shortcutIntent.putExtra("extra", "value") // 可选的额外数据 +// 添加标志,确保快捷方式启动新任务 + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) + shortcutIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) +// 构建ShortcutInfo + val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + ShortcutInfo.Builder(context, "code_table_shortcut_id") + .setShortLabel(context.getString(com.coldmint.rust.pro.R.string.code_table)) + .setLongLabel(context.getString(com.coldmint.rust.pro.R.string.code_table)) + .setIcon(Icon.createWithResource(context, com.coldmint.rust.pro.R.drawable.table)) + .setIntent(shortcutIntent) + .build() + } else { + TODO("VERSION.SDK_INT < N_MR1") + } +// 获取ShortcutManager + val shortcutManager: ShortcutManager = context.getSystemService(ShortcutManager::class.java) +// 添加动态快捷方式 + shortcutManager.addDynamicShortcuts(listOf(info))*/ + val intent = Intent(this@MainActivity, CodeTableActivity::class.java) +/* intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT)*/ + startActivity(intent) false } /*重要部分 diff --git a/app/src/main/java/com/coldmint/rust/pro/adapters/CodeTableAdapter.kt b/app/src/main/java/com/coldmint/rust/pro/adapters/CodeTableAdapter.kt index bb22d71..c329f57 100644 --- a/app/src/main/java/com/coldmint/rust/pro/adapters/CodeTableAdapter.kt +++ b/app/src/main/java/com/coldmint/rust/pro/adapters/CodeTableAdapter.kt @@ -5,11 +5,17 @@ import android.content.Context import android.graphics.Color import android.os.Handler import android.os.Looper +import android.text.SpannableStringBuilder +import android.text.Spanned +import android.text.style.BackgroundColorSpan +import android.text.style.ForegroundColorSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.MaterialDialog import com.coldmint.rust.core.database.code.CodeDataBase @@ -19,10 +25,11 @@ import com.coldmint.rust.core.tool.LineParser import com.coldmint.rust.pro.R import com.coldmint.rust.pro.databinding.CodeTableItemBinding import com.coldmint.rust.pro.databinding.ItemCodetableBinding +import com.coldmint.rust.pro.dialog.MaterialBottomDialog import com.coldmint.rust.pro.tool.AppSettings import com.coldmint.rust.pro.tool.GlobalMethod +import com.google.android.gms.common.internal.Objects import com.google.android.material.chip.Chip -import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.muqing.VH import java.util.concurrent.Executors @@ -204,7 +211,13 @@ class CodeTableAdapter( lineParser.symbol = "," } - var i: Int = -1 + companion object { + var i: String = null.toString() + var pick: Int = -1 + var pickString: String = "" + + } + @SuppressLint("StringFormatInvalid") override fun onBindViewHolder(holder: VH, position: Int) { holder.binging.title.text = group[position].translate @@ -214,19 +227,14 @@ class CodeTableAdapter( ) holder.binging.message.text = format holder.itemView.setOnClickListener { - val p: Int = holder.absoluteAdapterPosition - i = if (i == p) { - -1 - } else { - p - } - recyclerView.adapter = ITEM(itemList[position]) + i = group[position].translate + item = ITEM(itemList[position]) + recyclerView.adapter = item notifyDataSetChanged() // notifyItemChanged(p) } - if (i == position) { + if (Objects.equal(group[position].translate, i)) { //背景高亮 -// holder.binging.root.setCardBackgroundColor(ContextCompat.getColor(context, R.color.md_theme_dark_onSecondaryContainer)) } else { //背景恢复 @@ -234,8 +242,26 @@ class CodeTableAdapter( } } + + var item: ITEM? = null + inner class ITEM(val list: List) : RecyclerView.Adapter>() { + //在list查找是否有这个关键字 + fun search(keyword: String) { + pickString = keyword + for (i in list.indices) { + if (list[i].translate.contains(keyword) || list[i].description.contains(keyword) || list[i].code.contains(keyword)) { + //找到后列表定位 到顶部 + pick = i + (recyclerView.layoutManager as LinearLayoutManager).scrollToPositionWithOffset(i, 0) + notifyDataSetChanged() + break + } + } + + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { return VH(CodeTableItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)) } @@ -244,34 +270,57 @@ class CodeTableAdapter( return list.size } + private fun contains(string: String, textView: TextView) { + if (string.contains(pickString)) { + val spannableText = SpannableStringBuilder(string) + val highlightWord = pickString + val start = string.indexOf(highlightWord) + val end = start + highlightWord.length + if (start != -1) { + // 设置文字颜色 + val colorSpan = ForegroundColorSpan(Color.RED) + spannableText.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + // 设置背景颜色 + val backgroundSpan = BackgroundColorSpan(Color.YELLOW) + spannableText.setSpan(backgroundSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + } + textView.text = spannableText + } else { + textView.text = string + } + com.muqing.gj.sc(pickString) + } + @SuppressLint("StringFormatInvalid") override fun onBindViewHolder(holder: VH, position: Int) { val resultView: CodeTableItemBinding = holder.binging val codeInfo = list[position] - resultView.descriptionView.text = codeInfo.description + + contains(codeInfo.description, resultView.descriptionView) resultView.descriptionView.setOnClickListener { GlobalMethod.copyText(it.context, codeInfo.description, it) } - resultView.titleView.text = codeInfo.translate + + contains(codeInfo.translate, resultView.titleView) resultView.titleView.setOnClickListener { GlobalMethod.copyText(it.context, codeInfo.translate, it) } val demo = codeInfo.demo resultView.imageView.isVisible = demo.isNotBlank() resultView.imageView.setOnClickListener { - val dialog = MaterialAlertDialogBuilder(it.context) - dialog.setTitle(R.string.code_demo) - dialog.setMessage(demo) - dialog.setPositiveButton(R.string.dialog_ok, null) - dialog.show() + val materialBottomDialog = MaterialBottomDialog(it.context) + materialBottomDialog.setTitle(R.string.code_demo) + materialBottomDialog.setMessage(demo) + materialBottomDialog.show() } - resultView.subTitleView.text = codeInfo.code + contains(codeInfo.code, resultView.subTitleView) resultView.subTitleView.setOnClickListener { GlobalMethod.copyText(it.context, codeInfo.code, it) } resultView.valueTypeView.text = typeNameMap?.get(codeInfo.type) ?: codeInfo.type lineParser.text = codeInfo.section + // resultView.chipGroup.removeAllViews() var isNotEmpty = false lineParser.analyse { lineNum, lineData, isEnd -> @@ -292,6 +341,7 @@ class CodeTableAdapter( executorService.submit { val codeDataBase = CodeDataBase.getInstance(context) val typeInfo = codeDataBase.getValueTypeDao().findTypeByType(codeInfo.type) + if (typeInfo == null) { handler.post { handler.post { @@ -350,6 +400,8 @@ class CodeTableAdapter( } resultView.versionView.text = versionMap?.get(codeInfo.addVersion) ?: codeInfo.addVersion.toString() + + } } diff --git a/app/src/main/java/com/coldmint/rust/pro/adapters/DesignAdapter.kt b/app/src/main/java/com/coldmint/rust/pro/adapters/DesignAdapter.kt index e6e8ad2..23b968c 100644 --- a/app/src/main/java/com/coldmint/rust/pro/adapters/DesignAdapter.kt +++ b/app/src/main/java/com/coldmint/rust/pro/adapters/DesignAdapter.kt @@ -37,14 +37,13 @@ class DesignAdapter(private val onclick: Click) : RecyclerView.Adapter(R.id.message) + findViewById?.text = string + } + fun setTitle(string: String) { + val findViewById = findViewById(R.id.title) + findViewById?.text = string + } + + override fun setTitle(titleId: Int) { + super.setTitle(titleId) + val string = context.getString(titleId) + delegate.setTitle(string) + val findViewById = findViewById(R.id.title) + findViewById?.text = string + } +} diff --git a/app/src/main/res/layout/activity_code_table.xml b/app/src/main/res/layout/activity_code_table.xml index ba4e394..ae3a98b 100644 --- a/app/src/main/res/layout/activity_code_table.xml +++ b/app/src/main/res/layout/activity_code_table.xml @@ -14,44 +14,74 @@ + android:layout_margin="12dp"> + android:orientation="vertical"> - + android:layout_marginHorizontal="6dp" + android:gravity="center"> - + + + + + + android:layout_marginHorizontal="6dp" + android:gravity="end" + android:orientation="horizontal" + android:visibility="gone" + tools:visibility="visible"> + + + + + + @@ -103,7 +133,8 @@ + android:layout_marginHorizontal="3dp" + android:layout_marginVertical="3dp" /> + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_tab.xml b/app/src/main/res/layout/item_tab.xml index c60de41..27039b6 100644 --- a/app/src/main/res/layout/item_tab.xml +++ b/app/src/main/res/layout/item_tab.xml @@ -27,7 +27,7 @@ android:id="@+id/imageview" android:layout_width="24dp" android:layout_height="24dp" - android:layout_marginStart="6dp" + android:layout_marginStart="16dp" android:src="@drawable/visibility" /> \ No newline at end of file diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml new file mode 100644 index 0000000..f37f981 --- /dev/null +++ b/app/src/main/res/xml-v25/shortcuts.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/dialog/src/main/java/com/coldmint/dialog/BaseBottomDialog.kt b/dialog/src/main/java/com/coldmint/dialog/BaseBottomDialog.kt index 7254ebc..edd6512 100644 --- a/dialog/src/main/java/com/coldmint/dialog/BaseBottomDialog.kt +++ b/dialog/src/main/java/com/coldmint/dialog/BaseBottomDialog.kt @@ -18,7 +18,6 @@ abstract class BaseBottomDialog(val context: Cont protected val bottomSheetDialog: BottomSheetDialog by lazy { BottomSheetDialog(context) - } protected val layoutInflater by lazy {