diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index ce028fc1..99a7b1bb 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -1,7 +1,7 @@ { "$data": { "v6.7.0": { - "released_date": "2026/01/17", + "released_date": "2026/01/18", "feature": [ "插件中心功能, 支持插件的安装/卸载/更新等操作 (入口: 主页抽屉按钮/主页标签页)", "Paddle OCR (PP-OCRv5) 插件, 用于光学字符识别", @@ -99,6 +99,7 @@ "服务端模式连接时, 旋转屏幕及切换语言等触发 Activity 重建的操作导致 VSCode 控制台无法输出日志的问题 _[`issue #385`](http://issues.autojs6.com/385)_", "连接 VSCode 插件时, 多种方式同时连接可能导致日志打印数量成倍增加的问题", "布局分析页面生成代码时对于集合控件可能生成失败的问题 (试修) _[`issue #328`](http://issues.autojs6.com/328)_", + "浮动按钮 \"运行脚本\" 对话框后台操作文件时可能导致应用崩溃的问题", "小米设备 \"显示在其他应用上层\" 开关可能跳转到错误设置页面的问题", "构建工具启用 isCleanup[Paddle/Rapid]Ocr 配置选项时无法正常完成 Rebuild Project 任务的问题" ], diff --git a/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt b/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt index 57ee4657..7e93d1e7 100644 --- a/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt +++ b/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt @@ -38,8 +38,18 @@ object DialogUtils { @Suppress("DEPRECATION") WindowManager.LayoutParams.TYPE_PHONE } + + // Try setting window type before show(). + // zh-CN: 尝试在 show() 之前设置窗口类型. window?.setType(type) + + // Ensure window type is applied when window becomes available. + // zh-CN: 当 window 可用时确保窗口类型已正确应用. + dialog.setOnShowListener { + window?.setType(type) + } } + if (Looper.getMainLooper() == Looper.myLooper()) { dialog.show() } else { @@ -117,7 +127,7 @@ object DialogUtils { text = text } } - .show() + .let { showDialog(it) } } } } @@ -133,7 +143,7 @@ object DialogUtils { text = text } } - .show() + .let { showDialog(it) } true } ?: false } diff --git a/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java b/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java index 3a0288d0..b08fb6fb 100644 --- a/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java +++ b/app/src/main/java/org/autojs/autojs/ui/common/ScriptOperations.java @@ -19,6 +19,7 @@ import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.internal.functions.ObjectHelper; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; +import org.autojs.autojs.app.DialogUtils; import org.autojs.autojs.app.GlobalAppContext; import org.autojs.autojs.core.pref.Pref; import org.autojs.autojs.extension.MaterialDialogExtensions; @@ -389,15 +390,14 @@ public class ScriptOperations { } public void delete(final ScriptFile scriptFile) { - new MaterialDialog.Builder(mContext) + DialogUtils.showDialog(new MaterialDialog.Builder(mContext) .title(mContext.getString(R.string.text_confirm_to_delete)) .content(scriptFile.getName()) .negativeText(R.string.text_cancel) .positiveText(R.string.dialog_button_confirm) .positiveColorRes(R.color.dialog_button_caution) .onPositive((dialog, which) -> deleteWithoutConfirm(scriptFile)) - .build() - .show(); + .build()); } public void setAsWorkingDir(final ScriptFile scriptFile) { @@ -409,7 +409,7 @@ public class ScriptOperations { } String content = mContext.getString(R.string.text_old_path) + ": " + oldPath + "\n" + mContext.getString(R.string.text_new_path) + ": " + newPath; - new MaterialDialog.Builder(mContext) + DialogUtils.showDialog(new MaterialDialog.Builder(mContext) .title(mContext.getString(R.string.text_prompt)) .content(content) .negativeText(R.string.text_cancel) @@ -417,8 +417,7 @@ public class ScriptOperations { .positiveText(R.string.dialog_button_confirm) .positiveColorRes(R.color.dialog_button_warn) .onPositive((dialog, which) -> setAsWorkingDirNow(scriptFile)) - .build() - .show(); + .build()); } public void deleteWithoutConfirm(final ScriptFile scriptFile) { @@ -490,14 +489,14 @@ public class ScriptOperations { } public void importFile() { - new FileChooserDialogBuilder(mContext) + DialogUtils.showDialog(new FileChooserDialogBuilder(mContext) .dir(EnvironmentUtils.getExternalStoragePath()) .justScriptFile() .singleChoice(file -> importFile(file.getPath()).subscribe()) .title(R.string.text_select_file_to_import) .positiveText(R.string.dialog_button_confirm) .positiveColorRes(R.color.dialog_button_attraction) - .show(); + .build()); } public void timedTask(ScriptFile scriptFile) { diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java index 14d27ac0..94619c18 100644 --- a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerProjectToolbar.java @@ -1,19 +1,17 @@ package org.autojs.autojs.ui.explorer; -import static org.autojs.autojs.util.ViewUtils.showToast; - import android.content.Context; import android.content.Intent; +import android.content.res.ColorStateList; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; - import androidx.annotation.Nullable; import androidx.appcompat.widget.LinearLayoutCompat; import androidx.cardview.widget.CardView; - +import androidx.core.widget.ImageViewCompat; import org.autojs.autojs.AutoJs; import org.autojs.autojs.model.explorer.ExplorerChangeEvent; import org.autojs.autojs.model.explorer.ExplorerItem; @@ -27,6 +25,10 @@ import org.autojs.autojs6.R; import org.autojs.autojs6.databinding.ExplorerProjectToolbarBinding; import org.greenrobot.eventbus.Subscribe; +import java.util.List; + +import static org.autojs.autojs.util.ViewUtils.showToast; + /** * Modified by SuperMonster003 as of May 26, 2022. * Transformed by SuperMonster003 on May 12, 2023. @@ -41,6 +43,10 @@ public class ExplorerProjectToolbar extends CardView { private OnOperateListener mOnOperateListener; + // Unify action icon tint to match day/night theme, especially for overlay dialogs. + // zh-CN: 统一操作图标着色以匹配日/夜主题, 尤其用于 overlay 对话框场景. + ColorStateList mActionIconTint = ColorStateList.valueOf(getContext().getColor(R.color.project_toolbar_button)); + public ExplorerProjectToolbar(Context context) { super(context); init(); @@ -61,9 +67,18 @@ public class ExplorerProjectToolbar extends CardView { binding = ExplorerProjectToolbarBinding.inflate(LayoutInflater.from(getContext()), this, true); mProjectName = binding.projectName; - binding.projectRun.setOnClickListener(v -> run()); - binding.projectBuild.setOnClickListener(v -> build()); - binding.projectEdit.setOnClickListener(v -> edit()); + + ImageView projectRun = binding.projectRun; + ImageView projectBuild = binding.projectBuild; + ImageView projectEdit = binding.projectEdit; + + projectRun.setOnClickListener(v -> run()); + projectBuild.setOnClickListener(v -> build()); + projectEdit.setOnClickListener(v -> edit()); + + List.of(projectRun, projectBuild, projectEdit).forEach(imageView -> { + ImageViewCompat.setImageTintList(imageView, mActionIconTint); + }); this.setOnClickListener(v -> edit()); } diff --git a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt index f86aca74..f6f1ac58 100644 --- a/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/explorer/ExplorerView.kt @@ -2,6 +2,7 @@ package org.autojs.autojs.ui.explorer import android.annotation.SuppressLint import android.content.Context +import android.content.res.ColorStateList import android.util.AttributeSet import android.util.Log import android.view.ContextThemeWrapper @@ -12,6 +13,7 @@ import android.view.ViewGroup import android.widget.PopupMenu import android.widget.TextView import androidx.core.view.isVisible +import androidx.core.widget.ImageViewCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller @@ -126,15 +128,21 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef private val mPageStateHistories = Stack() private var mDirectorySpanSize = 2 + // Unify action icon tint to match day/night theme, especially for overlay dialogs. + // zh-CN: 统一操作图标着色以匹配日/夜主题, 尤其用于 overlay 对话框场景. + private val mActionIconTint by lazy { + ColorStateList.valueOf(context.getColor(R.color.explorer_file_operation_button)) + } + constructor(context: Context) : super(context) { - init() + init(context) } constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { - init() + init(context) } - private fun init() { + private fun init(context: Context) { ExplorerViewBinding.inflate(LayoutInflater.from(context), this, true).also { binding -> this.binding = binding binding.explorerItemList.also { @@ -703,6 +711,10 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef mOptions = explorerFileBinding.more.apply { setOnClickListener { withItemSelected { showOptionsMenu() } } } + listOf(mRun, mEdit, mInfo, mInstall, mOptions).forEach { view -> + ImageViewCompat.setImageTintList(view, mActionIconTint) + } + explorerFileBinding.item.setOnClickListener { withItemSelected { onItemClick() } } } @@ -934,6 +946,12 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef private var mExplorerPage: ExplorerPage? = null + init { + listOf(mOptions).forEach { view -> + ImageViewCompat.setImageTintList(view, mActionIconTint) + } + } + override fun bind(data: Any, position: Int) { if (data !is ExplorerPage) return mName.text = ExplorerViewHelper.getDisplayName(context, data) diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java index 87afe344..9c8eb7ee 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/CircularMenu.java @@ -86,8 +86,9 @@ public class CircularMenu implements LayoutInspector.CaptureAvailableListener { }; public CircularMenu(Context context) { - // mContext = new ContextThemeWrapper(context, R.style.AppTheme); - mContext = context; + // Use application context as base to avoid being treated as Activity context. + // zh-CN: 使用 application context 作为 base, 避免被识别为 Activity context. + mContext = new ContextThemeWrapper(context.getApplicationContext(), R.style.AppTheme); initFloaty(); setupWindowListeners(); mRecorder = GlobalActionRecorder.getSingleton(context); @@ -137,26 +138,39 @@ public class CircularMenu implements LayoutInspector.CaptureAvailableListener { ExplorerView explorerView = new ExplorerView(mContext); explorerView.setExplorer(Explorers.workspace(), ExplorerDirPage.createRoot(WorkingDirectoryUtils.getPath())); explorerView.setDirectorySpanSize(2); - final MaterialDialog dialog = new AppLevelThemeDialogBuilder(mContext) - .title(mContext.getString(R.string.text_run_script)) + final MaterialDialog dialog = new MaterialDialog.Builder(mContext) + .title(R.string.text_run_script) + .titleColorRes(R.color.day_night) .customView(explorerView, false) + .backgroundColorRes(R.color.window_background) .positiveText(R.string.dialog_button_dismiss) .positiveColorRes(R.color.dialog_button_default) .cancelable(false) .build(); - explorerView.setOnItemOperateListener(item -> dialog.dismiss()); + + // Only dismiss on clicking the item itself. + // zh-CN: 仅在点击条目本体时关闭对话框. explorerView.setOnItemClickListener((view, item) -> { if (item.isExecutable()) { - Scripts.run(mContext, item.toScriptFile()); + dialog.dismiss(); + Scripts.run(view != null ? view.getContext() : explorerView.getContext(), item.toScriptFile()); } else { - new MaterialDialog.Builder(mContext) + DialogUtils.showDialog(new MaterialDialog.Builder(mContext) .title(mContext.getString(R.string.error_failed_to_run_script)) - .content(mContext.getString(R.string.text_file_with_abs_path_is_not_an_executable_script, item.toScriptFile().getAbsolutePath())) + .content(mContext.getString( + R.string.text_file_with_abs_path_is_not_an_executable_script, + item.toScriptFile().getAbsolutePath() + )) .positiveText(R.string.dialog_button_dismiss) .positiveColorRes(R.color.dialog_button_failure) - .show(); + .build()); } }); + + // Do not dismiss on action buttons (run/edit/delete/rename/etc.). + // zh-CN: 点击右侧操作按钮 (运行/编辑/删除/重命名等) 时不关闭对话框. + explorerView.setOnItemOperateListener(null); + explorerView.setOnProjectToolbarOperateListener(toolbar -> dialog.dismiss()); explorerView.setOnProjectToolbarClickListener(toolbar -> toolbar.findViewById(R.id.project_run).performClick()); explorerView.setProjectToolbarRunnableOnly(true); diff --git a/app/src/main/res/layout/explorer_file.xml b/app/src/main/res/layout/explorer_file.xml index ec5fd3d6..3b52a349 100644 --- a/app/src/main/res/layout/explorer_file.xml +++ b/app/src/main/res/layout/explorer_file.xml @@ -108,7 +108,7 @@ android:focusable="true" android:src="@drawable/ic_install_explorer_btn" android:visibility="gone" - app:tint="#A9AAAB" + app:tint="@color/explorer_file_operation_button" tools:visibility="visible" /> @@ -162,7 +162,7 @@ android:contentDescription="@string/text_more" android:focusable="true" android:src="@drawable/ic_more_explorer_btn" - app:tint="#A9AAAB" /> + app:tint="@color/explorer_file_operation_button" /> diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml index a58635c6..92d10195 100644 --- a/app/src/main/res/values-night/colors.xml +++ b/app/src/main/res/values-night/colors.xml @@ -72,6 +72,7 @@ #9A9A9A #808080 + @color/md_gray_600 #A9AAAB #A9AAAB diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 70179119..c73ec4a6 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -169,6 +169,7 @@ #282C2F #9DA0A2 + #A9AAAB #606366 #606366 diff --git a/version.properties b/version.properties index 1a1f6863..941f7e6d 100644 --- a/version.properties +++ b/version.properties @@ -1,5 +1,5 @@ -#Sat Jan 17 18:13:03 CST 2026 -BUILD_TIME=1768644783702 +#Sun Jan 18 22:49:01 CST 2026 +BUILD_TIME=1768747741064 COMPILE_SDK_VERSION=36 IMAGE_QUANT_CMAKE_VERSION=3.22.1 IMAGE_QUANT_NDK_VERSION=26.1.10909125 @@ -27,6 +27,6 @@ RAPID_OCR_OPENCV_MOBILE_LABEL_VERSION=13 RAPID_OCR_OPENCV_MOBILE_VERSION=4.5.3 TARGET_SDK_VERSION=36 TARGET_SDK_VERSION_INRT=29 -VERSION_BUILD=3624 -VERSION_NAME=6.7.0 Alpha15 +VERSION_BUILD=3630 +VERSION_NAME=6.7.0 Alpha16 VSCODE_EXT_REQUIRED_VERSION=1.0.13