From 9f8211475793bf539d64032d2a14a6760c2c4271 Mon Sep 17 00:00:00 2001 From: SuperMonster003 Date: Fri, 9 May 2025 17:27:27 +0800 Subject: [PATCH] =?UTF-8?q?6.6.3=20-=20Alpha2=20-=20=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=E8=89=B2=E6=89=A9=E5=85=85=E9=80=82=E9=85=8D=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E6=9B=B4=E5=A4=9A=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changelog/lang_zh-Hans.json | 3 +- .../java/org/autojs/autojs/AbstractAutoJs.kt | 2 + .../java/org/autojs/autojs/app/DialogUtils.kt | 2 + .../autojs/app/tool/JsonSocketClientTool.kt | 4 + .../autojs/autojs/core/console/ConsoleImpl.kt | 4 + .../autojs/core/console/ConsoleView.java | 2 + .../core/record/GlobalActionRecorder.java | 10 +- .../extension/MaterialDialogExtensions.kt | 21 +- .../autojs/autojs/extension/ViewExtensions.kt | 29 +++ .../autojs/autojs/network/UpdateChecker.java | 64 +++--- .../DisplayOverOtherAppsPermission.kt | 6 +- .../permission/ManageAllFilesPermission.kt | 6 +- .../autojs/pluginclient/JsonSocketClient.kt | 5 + .../org/autojs/autojs/theme/ThemeColor.kt | 20 +- .../autojs/autojs/theme/ThemeColorHelper.java | 195 ++++++++++++++++-- .../autojs/autojs/theme/ThemeColorManager.kt | 11 +- .../theme/app/ColorInfoDialogManager.kt | 4 +- .../autojs/theme/app/ColorItemsActivity.kt | 26 ++- .../preference/MaterialDialogPreference.kt | 22 +- .../preference/MaterialListPreference.kt | 7 +- .../theme/preference/MaterialPreference.kt | 2 + .../autojs/theme/widget/ThemeColorCheckBox.kt | 40 ++++ .../theme/widget/ThemeColorImageViewCompat.kt | 12 +- .../theme/widget/ThemeColorRadioButton.kt | 40 ++++ .../autojs/theme/widget/ThemeColorSeekBar.kt | 40 ++++ .../theme/widget/ThemeColorTextInputLayout.kt | 43 ++++ .../autojs/autojs/ui/common/RxDialogs.java | 28 ++- .../autojs/ui/common/ScriptLoopDialog.java | 7 +- .../autojs/ui/common/ScriptOperations.java | 43 ++-- .../org/autojs/autojs/ui/edit/EditActivity.kt | 5 +- .../org/autojs/autojs/ui/edit/EditorMenu.java | 45 ++-- .../org/autojs/autojs/ui/edit/EditorView.kt | 6 + .../ui/edit/TextSizeSettingDialogBuilder.java | 3 + .../autojs/autojs/ui/edit/debug/DebugBar.java | 6 +- .../autojs/ui/edit/editor/CodeEditor.kt | 2 + .../autojs/ui/error/ErrorReportActivity.kt | 8 +- .../autojs/autojs/ui/explorer/ExplorerView.kt | 77 ++++--- .../filechooser/ExplorerItemViewHolder.java | 12 +- .../filechooser/ExplorerPageViewHolder.java | 15 +- .../filechooser/FileChooserDialogBuilder.java | 19 +- .../autojs/ui/floating/CircularMenu.java | 7 +- .../ui/floating/CodeGenerateDialog.java | 3 + .../ui/keystore/ManageKeyStoreActivity.kt | 10 +- .../autojs/ui/keystore/NewKeyStoreDialog.kt | 9 +- .../CommandBasedPermissionItemHelper.kt | 2 + .../main/drawer/DrawerMenuToggleableItem.kt | 4 + .../ui/main/scripts/ApkInfoDialogManager.kt | 24 +-- .../ui/main/scripts/MediaInfoDialogManager.kt | 2 +- .../autojs/ui/project/BuildActivity.java | 7 +- .../ui/project/ProjectConfigActivity.kt | 8 +- .../autojs/ui/settings/AboutActivity.kt | 7 +- .../DisplayVersionHistoriesActivity.kt | 3 +- .../ui/settings/WorkingDirectoryPreference.kt | 14 +- .../ui/shortcut/ShortcutCreateActivity.java | 43 +++- .../java/org/autojs/autojs/util/ColorUtils.kt | 53 +++-- .../org/autojs/autojs/util/DeviceUtils.kt | 2 + .../org/autojs/autojs/util/ShortcutUtils.kt | 1 + .../org/autojs/autojs/util/UpdateUtils.kt | 1 + .../java/org/autojs/autojs/util/ViewUtils.kt | 35 ++++ .../main/res/drawable/btn_radio_off_mtrl.xml | 47 +++++ .../main/res/drawable/btn_radio_on_mtrl.xml | 45 ++++ .../main/res/drawable/ic_add_smaller_48dp.png | Bin 0 -> 2415 bytes .../shortcut_create_dialog_icon_bg.xml | 2 +- .../shortcut_create_dialog_icon_border.xml | 10 + app/src/main/res/layout/activity_build.xml | 24 +-- .../res/layout/activity_project_config.xml | 24 +-- .../layout/activity_timed_task_setting.xml | 70 ++++--- .../main/res/layout/dialog_class_search.xml | 24 ++- .../res/layout/dialog_find_or_replace.xml | 51 ++--- .../main/res/layout/dialog_new_key_store.xml | 125 +++++++---- .../main/res/layout/dialog_script_loop.xml | 128 ++++++------ .../res/layout/dialog_text_size_setting.xml | 2 +- .../res/layout/dialog_verify_key_store.xml | 34 ++- .../res/layout/pref_working_directory.xml | 113 +++++----- .../res/layout/round_checkbox_with_text.xml | 45 ++-- .../res/layout/shortcut_create_dialog.xml | 29 +-- app/src/main/res/values-ar/strings.xml | 5 + app/src/main/res/values-en/strings.xml | 5 + app/src/main/res/values-es/strings.xml | 5 + app/src/main/res/values-fr/strings.xml | 15 +- app/src/main/res/values-ja/strings.xml | 5 + app/src/main/res/values-ko/strings.xml | 5 + app/src/main/res/values-night/colors.xml | 2 +- app/src/main/res/values-ru/strings.xml | 5 + app/src/main/res/values-zh-rHK/strings.xml | 5 + app/src/main/res/values-zh-rTW/strings.xml | 5 + app/src/main/res/values-zh/strings.xml | 5 + app/src/main/res/values/attrs.xml | 4 + app/src/main/res/values/dimens.xml | 3 + app/src/main/res/values/strings.xml | 6 + app/src/main/res/values/styles.xml | 10 + app/src/main/res/xml/fragment_preferences.xml | 1 + modules/color-picker/build.gradle | 1 + .../res/layout/cpv_dialog_custom_title.xml | 25 +-- 94 files changed, 1451 insertions(+), 565 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/extension/ViewExtensions.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorCheckBox.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorRadioButton.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorSeekBar.kt create mode 100644 app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorTextInputLayout.kt create mode 100644 app/src/main/res/drawable/btn_radio_off_mtrl.xml create mode 100644 app/src/main/res/drawable/btn_radio_on_mtrl.xml create mode 100644 app/src/main/res/drawable/ic_add_smaller_48dp.png create mode 100644 app/src/main/res/drawable/shortcut_create_dialog_icon_border.xml diff --git a/.changelog/lang_zh-Hans.json b/.changelog/lang_zh-Hans.json index a9244438..30509099 100644 --- a/.changelog/lang_zh-Hans.json +++ b/.changelog/lang_zh-Hans.json @@ -1,7 +1,7 @@ { "$data": { "v6.6.3": { - "released_date": "2025/05/07", + "released_date": "2025/05/09", "feature": [ "版本历史功能, 可查看发行版本历史更新记录 (多语言) 与统计数据", "timers.keepAlive 方法 (已全局化), 用于保持脚本活跃状态", @@ -20,6 +20,7 @@ "README.md 中部分语言日期格式不正确的问题" ], "improvement": [ + "主题色扩充适配范围并支持更多控件类型", "主页抽屉在横向屏幕或超宽屏幕的宽度适应性", "关于应用与开发者页面增加水平布局及小屏布局适配", "设置页面对话框相关设置支持 \"使用默认值\" 菜单选项", diff --git a/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt b/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt index d9a2cb45..a73828bc 100644 --- a/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt +++ b/app/src/main/java/org/autojs/autojs/AbstractAutoJs.kt @@ -29,6 +29,7 @@ import org.autojs.autojs.runtime.api.Shell import org.autojs.autojs.runtime.api.WrappedShizuku import org.autojs.autojs.script.AutoFileSource import org.autojs.autojs.script.JavaScriptSource +import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs.tool.UiHandler import org.autojs.autojs.util.StringUtils import org.autojs.autojs.util.ViewUtils @@ -81,6 +82,7 @@ abstract class AbstractAutoJs protected constructor(val application: Application addAccessibilityServiceDelegates() registerActivityLifecycleCallbacks() WrappedShizuku.onCreate() + ThemeColorManager.init() } private fun initContextFactory() { 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 34137583..3daea714 100644 --- a/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt +++ b/app/src/main/java/org/autojs/autojs/app/DialogUtils.kt @@ -107,6 +107,7 @@ object DialogUtils { .title(context.getString(R.string.dialog_button_more)) .content(contentMore) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build() .also { preference.longClickPromptMoreDialogHandler(it) } .show() @@ -114,6 +115,7 @@ object DialogUtils { } } .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .onPositive { dialog, _ -> dialog.dismiss() } .autoDismiss(false) .build() diff --git a/app/src/main/java/org/autojs/autojs/app/tool/JsonSocketClientTool.kt b/app/src/main/java/org/autojs/autojs/app/tool/JsonSocketClientTool.kt index 5e123514..e7b3f37a 100644 --- a/app/src/main/java/org/autojs/autojs/app/tool/JsonSocketClientTool.kt +++ b/app/src/main/java/org/autojs/autojs/app/tool/JsonSocketClientTool.kt @@ -73,6 +73,7 @@ class JsonSocketClientTool(context: Context) : AbstractJsonSocketTool(context) { .input(context.getString(R.string.text_pc_server_address), host) { dialog, _ -> connectToRemoteServer(dialog) } + .widgetThemeColor() .neutralText(R.string.dialog_button_history) .neutralColorRes(R.color.dialog_button_hint) .onNeutral { dialog, _ -> @@ -91,6 +92,7 @@ class JsonSocketClientTool(context: Context) : AbstractJsonSocketTool(context) { .title(R.string.text_prompt) .content(R.string.text_confirm_to_delete) .negativeText(R.string.dialog_button_cancel) + .neutralColorRes(R.color.dialog_button_default) .positiveText(R.string.dialog_button_confirm) .positiveColorRes(R.color.dialog_button_caution) .onPositive { ds, _ -> @@ -139,8 +141,10 @@ class JsonSocketClientTool(context: Context) : AbstractJsonSocketTool(context) { } } .negativeText(R.string.text_cancel) + .negativeColorRes(R.color.dialog_button_default) .onNegative { dialog, _ -> dialog.dismiss() } .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .autoDismiss(false) .dismissListener(onConnectionDialogDismissed) .show() diff --git a/app/src/main/java/org/autojs/autojs/core/console/ConsoleImpl.kt b/app/src/main/java/org/autojs/autojs/core/console/ConsoleImpl.kt index 1eb202ad..5f176de2 100644 --- a/app/src/main/java/org/autojs/autojs/core/console/ConsoleImpl.kt +++ b/app/src/main/java/org/autojs/autojs/core/console/ConsoleImpl.kt @@ -27,6 +27,7 @@ import com.afollestad.materialdialogs.MaterialDialog import org.autojs.autojs.annotation.ScriptInterface import org.autojs.autojs.core.pref.Language import org.autojs.autojs.core.ui.inflater.util.Gravities +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor import org.autojs.autojs.permission.DisplayOverOtherAppsPermission import org.autojs.autojs.runtime.ScriptRuntime import org.autojs.autojs.runtime.api.AbstractConsole @@ -282,8 +283,10 @@ open class ConsoleImpl(val uiHandler: UiHandler) : AbstractConsole() { ).apply { title(R.string.text_prompt) content("$msgReason, $msgAction.") + widgetThemeColor() cancelable(false) negativeText(R.string.dialog_button_quit) + negativeColorRes(R.color.dialog_button_default) positiveText(R.string.dialog_button_continue) positiveColorRes(R.color.dialog_button_attraction) onPositive { _, _ -> send(cutOutEntries) } @@ -347,6 +350,7 @@ open class ConsoleImpl(val uiHandler: UiHandler) : AbstractConsole() { dialog.titleView?.text = context.getString(R.string.text_details) } .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .onPositive { dialog, _ -> dialog.dismiss() } .show() } diff --git a/app/src/main/java/org/autojs/autojs/core/console/ConsoleView.java b/app/src/main/java/org/autojs/autojs/core/console/ConsoleView.java index 0b4092df..662447fe 100644 --- a/app/src/main/java/org/autojs/autojs/core/console/ConsoleView.java +++ b/app/src/main/java/org/autojs/autojs/core/console/ConsoleView.java @@ -22,6 +22,7 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import org.autojs.autojs.theme.ThemeColorHelper; import org.autojs.autojs.tool.MapBuilder; import org.autojs.autojs.ui.enhancedfloaty.ResizableExpandableFloatyWindow; import org.autojs.autojs.ui.log.LogActivity; @@ -400,6 +401,7 @@ public class ConsoleView extends FrameLayout implements ConsoleImpl.LogListener TextView textView = holder.textView; ConsoleImpl.LogEntry logEntry = mLogEntries.get(position); textView.setText(logEntry.content); + ThemeColorHelper.setThemeColorPrimary(textView, true); Integer color = mColors.get(logEntry.level); if (color != null) { textView.setTextColor(color); diff --git a/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java b/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java index 1aa81f9e..6503b2cc 100644 --- a/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java +++ b/app/src/main/java/org/autojs/autojs/core/record/GlobalActionRecorder.java @@ -10,6 +10,7 @@ import org.autojs.autojs.core.record.inputevent.InputEventRecorder; import org.autojs.autojs.core.record.inputevent.InputEventToAutoFileRecorder; import org.autojs.autojs.core.record.inputevent.InputEventToRootAutomatorRecorder; import org.autojs.autojs.core.record.inputevent.TouchRecorder; +import org.autojs.autojs.extension.MaterialDialogExtensions; import org.autojs.autojs.ui.common.ScriptOperations; import org.autojs.autojs.util.ClipboardUtils; import org.autojs.autojs.util.ViewUtils; @@ -164,7 +165,7 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { } private void showRecordHandleDialog(final String script) { - DialogUtils.showDialog(new MaterialDialog.Builder(mContext) + MaterialDialog.Builder builder = new MaterialDialog.Builder(mContext) .title(R.string.text_record_finished) .content(R.string.content_way_of_output_for_recorded_script) .items(getString(R.string.text_new_file), getString(R.string.text_copy_to_clip)) @@ -179,9 +180,12 @@ public class GlobalActionRecorder implements Recorder.OnStateChangedListener { return false; }) .negativeText(R.string.text_cancel) + .negativeColorRes(R.color.dialog_button_default) .positiveText(R.string.dialog_button_confirm) - .canceledOnTouchOutside(false) - .build()); + .positiveColorRes(R.color.dialog_button_attraction) + .canceledOnTouchOutside(false); + MaterialDialogExtensions.choiceWidgetThemeColor(builder); + DialogUtils.showDialog(builder.build()); } private String getString(int res) { diff --git a/app/src/main/java/org/autojs/autojs/extension/MaterialDialogExtensions.kt b/app/src/main/java/org/autojs/autojs/extension/MaterialDialogExtensions.kt index 11cf205c..85ad1fad 100644 --- a/app/src/main/java/org/autojs/autojs/extension/MaterialDialogExtensions.kt +++ b/app/src/main/java/org/autojs/autojs/extension/MaterialDialogExtensions.kt @@ -3,6 +3,7 @@ package org.autojs.autojs.extension import android.view.View import android.widget.TextView import com.afollestad.materialdialogs.MaterialDialog +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.util.ClipboardUtils import org.autojs.autojs.util.IntentUtils import org.autojs.autojs.util.ViewUtils @@ -35,20 +36,28 @@ object MaterialDialogExtensions { } } - fun TextView.setCopyableTextIfAbsent(dialog: MaterialDialog, f: () -> String?) { - val textView = this + fun MaterialDialog.setCopyableTextIfAbsent(textView: TextView, f: () -> String?) { val textValue = f.invoke() if (textView.text == context.getString(R.string.ellipsis_six)) { textView.text = textValue.takeUnless { it.isNullOrBlank() } ?: context.getString(R.string.text_unknown) } - dialog.makeTextCopyable(textView, textValue) + this.makeTextCopyable(textView, textValue) } - fun TextView.setCopyableText(dialog: MaterialDialog, f: () -> String?) { - val textView = this + fun MaterialDialog.setCopyableText(textView: TextView, f: () -> String?) { val textValue = f.invoke() textView.text = textValue.takeUnless { it.isNullOrBlank() } ?: context.getString(R.string.text_unknown) - dialog.makeTextCopyable(textView, textValue) + this.makeTextCopyable(textView, textValue) + } + + @JvmStatic + fun MaterialDialog.Builder.choiceWidgetThemeColor() = also { + it.choiceWidgetColor(ThemeColorHelper.getThemeColorStateList(context)) + } + + @JvmStatic + fun MaterialDialog.Builder.widgetThemeColor() = also { + it.widgetColor(ThemeColorHelper.getThemeColorStateList(context)) } } diff --git a/app/src/main/java/org/autojs/autojs/extension/ViewExtensions.kt b/app/src/main/java/org/autojs/autojs/extension/ViewExtensions.kt new file mode 100644 index 00000000..dbd8407a --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/extension/ViewExtensions.kt @@ -0,0 +1,29 @@ +package org.autojs.autojs.extension + +import android.annotation.SuppressLint +import android.os.Build +import android.widget.PopupMenu + +/** + * Created by SuperMonster003 on May 7, 2025. + */ +object ViewExtensions { + + fun PopupMenu.setForceShowIconCompat() { + val popup = this + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + popup.setForceShowIcon(true) + } else { + runCatching { + @SuppressLint("DiscouragedPrivateApi") + val field = PopupMenu::class.java.getDeclaredField("mPopup") + field.isAccessible = true + // MenuPopupHelper + val helper = field.get(popup) + val method = helper.javaClass.getDeclaredMethod("setForceShowIcon", Boolean::class.javaPrimitiveType) + method.invoke(helper, true) + } + } + } + +} diff --git a/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java b/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java index 5e9db82f..23850e83 100644 --- a/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java +++ b/app/src/main/java/org/autojs/autojs/network/UpdateChecker.java @@ -28,6 +28,7 @@ import org.autojs.autojs.network.download.DownloadManager; import org.autojs.autojs.network.entity.ExtendedVersionInfo; import org.autojs.autojs.network.entity.VersionInfo; import org.autojs.autojs.tool.SimpleObserver; +import org.autojs.autojs.ui.settings.DisplayVersionHistoriesActivity; import org.autojs.autojs.util.AndroidUtils; import org.autojs.autojs.util.IntentUtils; import org.autojs.autojs.util.TextUtils; @@ -194,6 +195,7 @@ public class UpdateChecker { if (!(e instanceof ObservableEmptyException)) { new Dialog.Builder.Prompt(mContext, R.string.error_check_for_update, e.getMessage()) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build().show(); return; } @@ -210,11 +212,13 @@ public class UpdateChecker { } new Dialog.Builder.Prompt(mContext, R.string.error_check_for_update, message.toString()) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build().show(); } else { new Dialog.Builder.Prompt(mContext, R.string.error_check_for_update, R.string.error_failed_to_retrieve_version_properties_file_to_parse_version_information) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build().show(); } } @@ -328,10 +332,15 @@ public class UpdateChecker { return; } - mUpdateDialog = new Dialog.Builder.Update(context, propVersion).build(); + mUpdateDialog = new Dialog.Builder.Update(context, versionInfo).build(); mPendingDialog = new Dialog.Builder.Pending(context, R.string.text_preparing).build(); - setupDialogButtons(versionInfo, context); + MDButton negativeButton = mUpdateDialog.getActionButton(DialogAction.NEGATIVE); + negativeButton.setOnClickListener(v -> mUpdateDialog.dismiss()); + + MDButton positiveButton = mUpdateDialog.getActionButton(DialogAction.POSITIVE); + positiveButton.setOnClickListener(null); + mUpdateDialog.show(); mGitHubExecutor.execute(() -> { @@ -373,28 +382,6 @@ public class UpdateChecker { }); } - private void setupDialogButtons(@NonNull VersionInfo versionInfo, Context context) { - MDButton neutralButton = mUpdateDialog.getActionButton(DialogAction.NEUTRAL); - neutralButton.setOnClickListener(v -> new MaterialDialog.Builder(context) - .title(R.string.text_prompt) - .content(R.string.prompt_add_ignored_version) - .negativeText(R.string.dialog_button_cancel) - .positiveText(R.string.dialog_button_confirm) - .positiveColorRes(R.color.dialog_button_warn) - .onPositive((dialog, which) -> { - UpdateUtils.addIgnoredVersion(versionInfo); - ViewUtils.showToast(context, R.string.text_done); - mUpdateDialog.dismiss(); - }) - .show()); - - MDButton negativeButton = mUpdateDialog.getActionButton(DialogAction.NEGATIVE); - negativeButton.setOnClickListener(v -> mUpdateDialog.dismiss()); - - MDButton positiveButton = mUpdateDialog.getActionButton(DialogAction.POSITIVE); - positiveButton.setOnClickListener(null); - } - private void fetchLatestReleaseNotes(Context context, VersionInfo versionInfo, GHRepository repo, GHRelease release, String releaseTag) { Language language = Objects.requireNonNullElse(Language.getPrefLanguageOrNull(), Language.EN); String languageTag = language.getLocalCompatibleLanguageTag(); @@ -636,7 +623,8 @@ public class UpdateChecker { if (targetAsset == null) { mHandler.post(() -> new Dialog.Builder .Prompt(ctx, R.string.error_parse_github_release_assets) - .positiveText(R.string.text_cancel) + .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build().show()); return; } @@ -736,6 +724,7 @@ public class UpdateChecker { .title(title) .content(content) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .cancelable(false); } @@ -743,13 +732,30 @@ public class UpdateChecker { public static class Update extends MaterialDialog.Builder { - public Update(Context context, String title) { + public Update(Context context, VersionInfo versionInfo) { super(context); this - .title(title) + .title(versionInfo.getVersionName()) + .options(List.of(new MaterialDialog.OptionMenuItemSpec(context.getString(R.string.dialog_button_ignore_current_update), parentDialog -> { + new MaterialDialog.Builder(context) + .title(R.string.text_prompt) + .content(R.string.prompt_add_ignored_version) + .negativeText(R.string.dialog_button_cancel) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_warn) + .onPositive((tmpDialog, which) -> { + UpdateUtils.addIgnoredVersion(versionInfo); + ViewUtils.showToast(context, R.string.text_done); + parentDialog.dismiss(); + }) + .show(); + }))) .content(R.string.text_getting_release_notes) - .neutralText(R.string.dialog_button_ignore_current_update) - .neutralColor(context.getColor(R.color.dialog_button_warn)) + .neutralText(R.string.dialog_button_version_histories) + .neutralColor(context.getColor(R.color.dialog_button_hint)) + .onNeutral((dialog, which) -> { + DisplayVersionHistoriesActivity.launch(context); + }) .negativeText(R.string.dialog_button_cancel) .negativeColor(context.getColor(R.color.dialog_button_default)) .positiveText(R.string.dialog_button_update_now) diff --git a/app/src/main/java/org/autojs/autojs/permission/DisplayOverOtherAppsPermission.kt b/app/src/main/java/org/autojs/autojs/permission/DisplayOverOtherAppsPermission.kt index 5be133e6..55aed61c 100644 --- a/app/src/main/java/org/autojs/autojs/permission/DisplayOverOtherAppsPermission.kt +++ b/app/src/main/java/org/autojs/autojs/permission/DisplayOverOtherAppsPermission.kt @@ -4,6 +4,7 @@ import android.content.Context import android.os.Handler import android.os.Looper import ezy.assist.compat.SettingsCompat +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor import org.autojs.autojs.ui.common.NotAskAgainDialog import org.autojs.autojs.ui.enhancedfloaty.util.FloatingWindowPermissionUtil import org.autojs.autojs.ui.main.drawer.PermissionItemHelper @@ -64,9 +65,12 @@ class DisplayOverOtherAppsPermission(override val context: Context) : Permission context.getString(R.string.text_click_ok_to_go_to_access_settings), ) ) + .widgetThemeColor() .negativeText(R.string.text_cancel) - .positiveText(R.string.text_ok) + .negativeColorRes(R.color.dialog_button_default) .onNegative { dialog, _ -> dialog.dismiss() } + .positiveText(R.string.text_ok) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive { dialog, _ -> dialog.dismiss().also { config() } } .cancelable(false) .autoDismiss(false) diff --git a/app/src/main/java/org/autojs/autojs/permission/ManageAllFilesPermission.kt b/app/src/main/java/org/autojs/autojs/permission/ManageAllFilesPermission.kt index f49150e6..61edf505 100644 --- a/app/src/main/java/org/autojs/autojs/permission/ManageAllFilesPermission.kt +++ b/app/src/main/java/org/autojs/autojs/permission/ManageAllFilesPermission.kt @@ -9,6 +9,7 @@ import android.os.Build import android.os.Environment import android.provider.Settings import androidx.core.app.ActivityCompat +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor import org.autojs.autojs.permission.Base.getPermissionsToRequest import org.autojs.autojs.ui.common.NotAskAgainDialog import org.autojs.autojs.ui.main.MainActivity @@ -78,8 +79,11 @@ class ManageAllFilesPermission(override val context: Context) : PermissionItemHe context.getString(R.string.text_click_ok_to_go_to_access_settings), ) ) + .widgetThemeColor() .negativeText(R.string.text_cancel) - .positiveText(R.string.text_ok) + .negativeColorRes(R.color.dialog_button_default) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onNegative { dialog, _ -> dialog.dismiss() } .onPositive { dialog, _ -> request() diff --git a/app/src/main/java/org/autojs/autojs/pluginclient/JsonSocketClient.kt b/app/src/main/java/org/autojs/autojs/pluginclient/JsonSocketClient.kt index 3802d695..0eb4744e 100644 --- a/app/src/main/java/org/autojs/autojs/pluginclient/JsonSocketClient.kt +++ b/app/src/main/java/org/autojs/autojs/pluginclient/JsonSocketClient.kt @@ -130,6 +130,7 @@ class JsonSocketClient(service: DevPluginService?, private val ctx: Context, hos .title(activity.getString(R.string.text_connection_cannot_be_established)) .content(msg) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .build() .also { it.contentView?.apply { @@ -236,6 +237,10 @@ class JsonSocketClient(service: DevPluginService?, private val ctx: Context, hos serverAddressHistories = serverAddressHistories.apply { remove(ip) } } + fun clearAllHistories() { + serverAddressHistories = linkedSetOf() + } + val cxnState = PublishSubject.create() var isClientSocketNormallyClosed diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt b/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt index 4e3d3111..7e10b27b 100644 --- a/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt +++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColor.kt @@ -4,12 +4,8 @@ import android.content.Context import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import org.autojs.autojs.annotation.ScriptInterface -import org.autojs.autojs.core.pref.Pref.containsKey -import org.autojs.autojs.core.pref.Pref.getInt -import org.autojs.autojs.core.pref.Pref.putInt +import org.autojs.autojs.core.pref.Pref import org.autojs.autojs.extension.ArrayExtensions.toHashCode -import org.autojs.autojs.theme.ThemeColorManager.defaultThemeColor -import org.autojs.autojs.util.ViewUtils import org.autojs.autojs6.R /** @@ -44,9 +40,9 @@ class ThemeColor(@JvmField var colorPrimary: Int, @JvmField var colorPrimaryDark fun colorAccent(colorAccent: Int) = also { this.colorAccent = colorAccent } fun saveIn() { - putInt(R.string.key_theme_color_primary, colorPrimary) - putInt(R.string.key_theme_color_primary_dark, colorPrimaryDark) - putInt(R.string.key_theme_color_accent, colorAccent) + Pref.putInt(R.string.key_theme_color_primary, colorPrimary) + Pref.putInt(R.string.key_theme_color_primary_dark, colorPrimaryDark) + Pref.putInt(R.string.key_theme_color_accent, colorAccent) } override fun equals(other: Any?): Boolean { @@ -60,9 +56,9 @@ class ThemeColor(@JvmField var colorPrimary: Int, @JvmField var colorPrimaryDark } fun readFrom() = also { - colorPrimary = getInt(R.string.key_theme_color_primary, defaultThemeColor.colorPrimary) - colorAccent = getInt(R.string.key_theme_color_accent, defaultThemeColor.colorAccent) - colorPrimaryDark = getInt(R.string.key_theme_color_primary_dark, defaultThemeColor.colorPrimaryDark) + colorPrimary = Pref.getInt(R.string.key_theme_color_primary, ThemeColorManager.defaultThemeColor.colorPrimary) + colorAccent = Pref.getInt(R.string.key_theme_color_accent, ThemeColorManager.defaultThemeColor.colorAccent) + colorPrimaryDark = Pref.getInt(R.string.key_theme_color_primary_dark, ThemeColorManager.defaultThemeColor.colorPrimaryDark) } override fun hashCode(): Int { @@ -72,7 +68,7 @@ class ThemeColor(@JvmField var colorPrimary: Int, @JvmField var colorPrimaryDark companion object { fun fromPreferences(): ThemeColor? { - return if (containsKey( + return if (Pref.containsKey( R.string.key_theme_color_primary, R.string.key_theme_color_primary_dark, R.string.key_theme_color_accent diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java index 4b6dd2ad..216aa77d 100644 --- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java +++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorHelper.java @@ -4,21 +4,34 @@ import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.ShapeDrawable; +import android.os.Build; import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.widget.AbsListView; import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.SeekBar; import android.widget.Switch; +import android.widget.TextView; import androidx.annotation.ColorInt; +import androidx.annotation.IdRes; +import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.AppCompatImageView; import androidx.appcompat.widget.SwitchCompat; import androidx.core.graphics.drawable.DrawableCompat; +import com.afollestad.materialdialogs.internal.MDTintHelper; +import com.google.android.material.textfield.TextInputLayout; import com.wdullaer.materialdatetimepicker.date.DatePickerDialog; import com.wdullaer.materialdatetimepicker.time.TimePickerDialog; import org.autojs.autojs.theme.internal.ScrollingViewEdgeGlowColorHelper; @@ -60,6 +73,63 @@ public class ThemeColorHelper { } } + public static void setColorPrimary(SwitchCompat switchCompat, int color) { + setColorPrimary(switchCompat, color, false); + } + + public static void setColorPrimary(SwitchCompat switchCompat, int color, boolean contrastMatters) { + int adjustedThumbColor = contrastMatters + ? ColorUtils.adjustColorForContrast(switchCompat.getContext().getColor(R.color.window_background), color, 2.3) + : color; + int adjustedTrackColor = contrastMatters + ? ColorUtils.adjustColorForContrast(switchCompat.getContext().getColor(R.color.window_background), color, 3.6) + : color; + + setThumbDrawableTintList(switchCompat.getThumbDrawable(), adjustedThumbColor); + setTrackDrawableTintList(switchCompat.getTrackDrawable(), adjustedTrackColor, true); + } + + public static void setThemeColorPrimary(Menu menu, Context context, @ColorInt int backgroundColor, @IdRes int checkedIdRes) { + setColorPrimary(menu, context, backgroundColor, ThemeColorManager.getColorPrimary(), true, checkedIdRes); + } + + public static void setThemeColorPrimary(Menu menu, Context context, boolean contrastMatters, @IdRes int checkedIdRes) { + setColorPrimary(menu, context, ThemeColorManager.getColorPrimary(), contrastMatters, checkedIdRes); + } + + public static void setColorPrimary(Menu menu, Context ctx, @ColorInt int color, boolean contrastMatters, @IdRes int checkedIdRes) { + int bg = ctx.getColor(R.color.window_background); + setColorPrimary(menu, ctx, bg, color, contrastMatters, checkedIdRes); + } + + public static void setColorPrimary(Menu menu, Context ctx, @ColorInt int backgroundColor, @ColorInt int referenceColor, boolean contrastMatters, @IdRes int checkedIdRes) { + int checkedColor = contrastMatters + ? ColorUtils.adjustColorForContrast(backgroundColor, referenceColor, 2.3f) + : referenceColor; + int uncheckedColor = contrastMatters + ? ColorUtils.adjustColorForContrast(backgroundColor, referenceColor, 1.9f, 0.6f) + : ColorUtils.applyAlpha(referenceColor, 0.6f); + + Drawable checked = tintDrawable( + AppCompatResources.getDrawable(ctx, R.drawable.btn_radio_on_mtrl).mutate(), + checkedColor); + + Drawable unchecked = tintDrawable( + AppCompatResources.getDrawable(ctx, R.drawable.btn_radio_off_mtrl).mutate(), + uncheckedColor); + + for (int i = 0; i < menu.size(); i++) { + MenuItem item = menu.getItem(i); + item.setIcon(item.getItemId() == checkedIdRes ? checked : unchecked); + } + } + + private static Drawable tintDrawable(Drawable drawable, int color) { + Drawable wrapped = DrawableCompat.wrap(drawable); + DrawableCompat.setTint(wrapped, color); + return wrapped; + } + public static void setThemeColorPrimary(TimePickerDialog timePickerDialog, Context context, boolean contrastMatters) { setThemeColorPrimary(timePickerDialog, context, ThemeColorManager.getColorPrimary(), contrastMatters); } @@ -82,30 +152,63 @@ public class ThemeColorHelper { datePickerDialog.setAccentColor(color); } - public static void setColorPrimary(SwitchCompat switchCompat, int color) { - setColorPrimary(switchCompat, color, false); + public static void setThemeColorPrimary(SeekBar seekBar, boolean contrastMatters) { + setColorPrimary(seekBar, ThemeColorManager.getColorPrimary(), contrastMatters); } - public static void setColorPrimary(SwitchCompat switchCompat, int color, boolean contrastMatters) { - int adjustedThumbColor = contrastMatters - ? ColorUtils.adjustColorForContrast(switchCompat.getContext().getColor(R.color.window_background), color, 2.3) + public static void setColorPrimary(SeekBar seekBar, int color, boolean contrastMatters) { + int primaryColor = contrastMatters + ? ColorUtils.adjustColorForContrast(seekBar.getContext().getColor(R.color.window_background), color, 2.3) : color; - int adjustedTrackColor = contrastMatters - ? ColorUtils.adjustColorForContrast(switchCompat.getContext().getColor(R.color.window_background), color, 3.6) + int secondaryColor = contrastMatters + ? ColorUtils.adjustColorForContrast(seekBar.getContext().getColor(R.color.window_background), color, 1.9) : color; + seekBar.setThumbTintList(ColorStateList.valueOf(primaryColor)); + seekBar.setProgressTintList(ColorStateList.valueOf(secondaryColor)); + } - setThumbDrawableTintList(switchCompat.getThumbDrawable(), adjustedThumbColor); - setTrackDrawableTintList(switchCompat.getTrackDrawable(), adjustedTrackColor, true); + public static void setThemeColorPrimary(CheckBox checkBox, int backgroundColor) { + setColorPrimary(checkBox, backgroundColor, ThemeColorManager.getColorPrimary()); + } + + public static void setColorPrimary(CheckBox checkBox, int backgroundColor, int referenceColor) { + int checkedColor = ColorUtils.adjustColorForContrast(backgroundColor, referenceColor, 2.3); + int uncheckedColor = ColorUtils.adjustColorForContrast(backgroundColor, referenceColor, 1.9, 0.6); + DrawableCompat.setTintList(DrawableCompat.wrap(checkBox.getButtonDrawable()), new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor})); } public static void setColorPrimary(CheckBox checkBox, int color, boolean contrastMatters) { + var button = ((CompoundButton) checkBox); + setColorPrimary(button, color, contrastMatters); + } + + public static void setThemeColorPrimary(CompoundButton button, boolean contrastMatters) { + setColorPrimary(button, ThemeColorManager.getColorPrimary(), contrastMatters); + } + + public static void setColorPrimary(CompoundButton button, int color, boolean contrastMatters) { int checkedColor = contrastMatters - ? ColorUtils.adjustColorForContrast(checkBox.getContext().getColor(R.color.window_background), color, 3.6) + ? ColorUtils.adjustColorForContrast(button.getContext().getColor(R.color.window_background), color, 2.3) : color; int uncheckedColor = contrastMatters - ? ColorUtils.adjustColorForContrast(checkBox.getContext().getColor(R.color.window_background), color, 2.3) - : color; - DrawableCompat.setTintList(DrawableCompat.wrap(checkBox.getButtonDrawable()), new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor})); + ? ColorUtils.adjustColorForContrast(button.getContext().getColor(R.color.window_background), color, 1.9, 0.6) + : ColorUtils.applyAlpha(color, 0.6); + DrawableCompat.setTintList(DrawableCompat.wrap(button.getButtonDrawable()), new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor})); + } + + public static void setThemeColorPrimary(AppCompatImageView imageView, boolean contrastMatters) { + setColorPrimary(imageView, ThemeColorManager.getColorPrimary(), contrastMatters); + } + + public static void setColorPrimary(AppCompatImageView imageView, int color, boolean contrastMatters) { + if (contrastMatters) { + color = ColorUtils.adjustColorForContrast(imageView.getContext().getColor(R.color.window_background), color, 2.3); + } + Drawable drawable = imageView.getDrawable(); + if (drawable != null) { + // noinspection deprecation + drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN); + } } public static void setColorPrimary(Switch sw, int color) { @@ -124,6 +227,65 @@ public class ThemeColorHelper { setTrackDrawableTintList(sw.getTrackDrawable(), adjustedTrackColor, false); } + public static void setThemeColorPrimary(TextInputLayout textInputLayout, boolean contrastMatters) { + setColorPrimary(textInputLayout, ThemeColorManager.getColorPrimary(), contrastMatters); + } + + public static void setColorPrimary(TextInputLayout textInputLayout, int color, boolean contrastMatters) { + EditText editText = textInputLayout.getEditText(); + if (editText != null) { + setThemeColorPrimary(editText, contrastMatters); + } + int tintColor = contrastMatters + ? ColorUtils.adjustColorForContrast(textInputLayout.getContext().getColor(R.color.window_background), color, 3.6) + : color; + textInputLayout.setHintTextColor(ColorStateList.valueOf(tintColor)); + } + + public static void setThemeColorPrimary(EditText editText, boolean contrastMatters) { + setColorPrimary(editText, ThemeColorManager.getColorPrimary(), contrastMatters); + } + + public static void setColorPrimary(EditText editText, int color, boolean contrastMatters) { + if (contrastMatters) { + color = ColorUtils.adjustColorForContrast(editText.getContext().getColor(R.color.window_background), color, 2.3); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + Drawable textCursorDrawable = editText.getTextCursorDrawable(); + textCursorDrawable.setTint(color); + editText.setTextCursorDrawable(textCursorDrawable); + + Drawable textSelectHandle = editText.getTextSelectHandle(); + textSelectHandle.setTint(color); + editText.setTextSelectHandle(textSelectHandle); + + Drawable textSelectHandleLeft = editText.getTextSelectHandleLeft(); + textSelectHandleLeft.setTint(color); + editText.setTextSelectHandleLeft(textSelectHandleLeft); + + Drawable textSelectHandleRight = editText.getTextSelectHandleRight(); + textSelectHandleRight.setTint(color); + editText.setTextSelectHandleRight(textSelectHandleRight); + } + MDTintHelper.setTint(editText, color); + } + + public static void setThemeColorPrimary(TextView textView, boolean contrastMatters) { + setColorPrimary(textView, ThemeColorManager.getColorPrimary(), contrastMatters); + } + + public static void setColorPrimary(TextView textView, int color, boolean contrastMatters) { + Context context = textView.getContext(); + if (contrastMatters) { + color = ColorUtils.adjustColorForContrast(context.getColor(R.color.window_background), color, 2.3); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + textView.setTextSelectHandle(tintDrawable(textView.getTextSelectHandle(), color)); + textView.setTextSelectHandleLeft(tintDrawable(textView.getTextSelectHandleLeft(), color)); + textView.setTextSelectHandleRight(tintDrawable(textView.getTextSelectHandleRight(), color)); + } + } + private static void setThumbDrawableTintList(Drawable drawable, int color) { int unselectedColor = ViewUtils.isLuminanceLight(color) ? Color.parseColor("#616161") // R.color.md_gray_700 @@ -147,15 +309,15 @@ public class ThemeColorHelper { private static int makeAlpha(int alpha, int color) { return (color & 0xffffff) | (alpha << 24); } - + public static ColorStateList getThemeColorStateList(Context context) { return getColorPrimaryStateList(context, ThemeColorManager.getColorPrimary()); } public static ColorStateList getColorPrimaryStateList(Context context, int color) { int background = context.getColor(R.color.window_background); - int checkedColor = ColorUtils.adjustColorForContrast(background, color, 3.6); - int uncheckedColor = ColorUtils.adjustColorForContrast(background, color, 2.3); + int checkedColor = ColorUtils.adjustColorForContrast(background, color, 2.3); + int uncheckedColor = ColorUtils.adjustColorForContrast(background, color, 1.9, 0.6); return new ColorStateList(SWITCH_STATES, new int[]{checkedColor, uncheckedColor}); } @@ -177,4 +339,5 @@ public class ThemeColorHelper { view.setBackgroundColor(color); } } + } diff --git a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt index 2a0ad6e6..7bfe2c03 100644 --- a/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt +++ b/app/src/main/java/org/autojs/autojs/theme/ThemeColorManager.kt @@ -7,7 +7,6 @@ import android.view.View import org.autojs.autojs.AbstractAutoJs.Companion.isInrt import org.autojs.autojs.util.ColorUtils import org.autojs.autojs.util.ViewUtils -import org.autojs.autojs6.R import java.lang.ref.WeakReference import java.util.* @@ -18,9 +17,11 @@ object ThemeColorManager { @JvmField var defaultThemeColor = when { - isInrt -> R.color.md_blue_gray_900 - else -> R.color.theme_color_default - }.let { ThemeColor(ColorUtils.fromResources(it)) } + // R.color.md_blue_gray_900 + isInrt -> "#263238" + // R.color.theme_color_default + else -> "#00695C" + }.let { ThemeColor(ColorUtils.parseColor(it)) } @JvmStatic lateinit var currentThemeColor: ThemeColor @@ -29,7 +30,7 @@ object ThemeColorManager { val colorPrimary: Int get() = currentThemeColor.colorPrimary - init { + fun init() { ThemeColor.fromPreferences()?.let { currentThemeColor = it } ?: setThemeColor(defaultThemeColor) } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorInfoDialogManager.kt index c4711d3e..3297f9de 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorInfoDialogManager.kt @@ -33,8 +33,8 @@ object ColorInfoDialogManager { MaterialDialog.Builder(context) .title(R.string.text_prompt) .content(R.string.error_invalid_color) - .positiveColorRes(R.color.dialog_button_default) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .show() return } @@ -109,7 +109,7 @@ object ColorInfoDialogManager { private suspend fun TextView.bindWith(dialog: MaterialDialog, text: String) { withContext(Dispatchers.Main) { - this@bindWith.setCopyableText(dialog) { text } + dialog.setCopyableText(this@bindWith) { text } } } diff --git a/app/src/main/java/org/autojs/autojs/theme/app/ColorItemsActivity.kt b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemsActivity.kt index ec2ca284..f85256cb 100644 --- a/app/src/main/java/org/autojs/autojs/theme/app/ColorItemsActivity.kt +++ b/app/src/main/java/org/autojs/autojs/theme/app/ColorItemsActivity.kt @@ -15,6 +15,7 @@ import android.view.View.OnClickListener import androidx.appcompat.widget.Toolbar import androidx.core.view.forEach import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView @@ -100,10 +101,8 @@ class ColorItemsActivity : ColorSelectBaseActivity() { private fun updateClickListener(toolbar: Toolbar) { when (mLibrary.id) { - Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE) -> object : OnClickListener { - override fun onClick(v: View?) { - showColorDetails(ThemeColorManager.colorPrimary, getSubtitle(false)) - } + Pref.getInt(KEY_SELECTED_COLOR_LIBRARY_ID, SELECT_NONE) -> OnClickListener { + showColorDetails(ThemeColorManager.colorPrimary, getSubtitle(false)) } else -> null }.let { toolbar.setOnClickListener(it) } @@ -167,13 +166,18 @@ class ColorItemsActivity : ColorSelectBaseActivity() { }) } - val layoutManager = recyclerView.layoutManager as? LinearLayoutManager - layoutManager?.let { manager -> - val smoothScroller = object : LinearSmoothScroller(this) { - override fun getVerticalSnapPreference() = SNAP_TO_START - }.apply { this.targetPosition = targetPosition } - manager.startSmoothScroll(smoothScroller) - } ?: recyclerView.smoothScrollToPosition(targetPosition) + val layoutManager = recyclerView.layoutManager + + val smoothScroller = object : LinearSmoothScroller(this) { + override fun getVerticalSnapPreference() = SNAP_TO_START + }.apply { this.targetPosition = targetPosition } + + when (layoutManager) { + null -> recyclerView.smoothScrollToPosition(targetPosition) + is GridLayoutManager -> layoutManager.startSmoothScroll(smoothScroller) + is LinearLayoutManager -> layoutManager.startSmoothScroll(smoothScroller) + else -> layoutManager.startSmoothScroll(smoothScroller) + } mInitiallyItemIdScrollTo = -1 } diff --git a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialDialogPreference.kt b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialDialogPreference.kt index 2993c196..148e92a0 100644 --- a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialDialogPreference.kt +++ b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialDialogPreference.kt @@ -16,8 +16,10 @@ open class MaterialDialogPreference : MaterialPreference { protected var dialogContent: CharSequence? = null protected var neutralText: CharSequence? = null protected var negativeText: CharSequence? = null + protected var negativeColor: Int? = null protected var neutralTextShort: CharSequence? = null protected var positiveText: CharSequence? = null + protected var positiveColor: Int? = null constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { init(context, attrs, defStyleAttr, defStyleRes) @@ -46,7 +48,13 @@ open class MaterialDialogPreference : MaterialPreference { neutralText = getAttrString(a, R.styleable.MaterialDialogPreference_neutralText) neutralTextShort = getAttrString(a, R.styleable.MaterialDialogPreference_neutralTextShort) negativeText = getAttrString(a, R.styleable.MaterialDialogPreference_negativeText) + getAttrColor(a, R.styleable.MaterialDialogPreference_negativeColor)?.takeIf { it != -1 }?.let { + negativeColor = it + } positiveText = getAttrString(a, R.styleable.MaterialDialogPreference_positiveText) + getAttrColor(a, R.styleable.MaterialDialogPreference_positiveColor)?.takeIf { it != -1 }?.let { + positiveColor = it + } a.recycle() } } @@ -75,8 +83,18 @@ open class MaterialDialogPreference : MaterialPreference { dialogTitle?.let { builder.title(it) } dialogContent?.let { builder.content(it) } setNeutralTextIfNeeded(builder) - negativeText?.let { builder.negativeText(it) } - positiveText?.let { builder.positiveText(it) } + negativeText?.let { + builder.negativeText(it) + negativeColor?.let { color -> builder.negativeColor(color) } ?: run { + builder.negativeColorRes(R.color.dialog_button_default) + } + } + positiveText?.let { + builder.positiveText(it) + positiveColor?.let { color -> builder.positiveColor(color) } ?: run { + builder.positiveColorRes(R.color.dialog_button_attraction) + } + } } private fun setNeutralTextIfNeeded(builder: MaterialDialog.Builder) { diff --git a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialListPreference.kt b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialListPreference.kt index 9236f080..9e8848b8 100644 --- a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialListPreference.kt +++ b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialListPreference.kt @@ -6,6 +6,8 @@ import android.text.TextUtils import android.util.AttributeSet import com.afollestad.materialdialogs.MaterialDialog import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.extension.MaterialDialogExtensions.choiceWidgetThemeColor +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor import org.autojs.autojs.ui.common.NotAskAgainDialog import org.autojs.autojs6.R @@ -89,6 +91,7 @@ open class MaterialListPreference : MaterialDialogPreference { builder.autoDismiss(false) builder.onNegative { d, _ -> d.dismiss() } builder.items(it) + builder.choiceWidgetThemeColor() builder.takeIf { mItemDisables.isNotEmpty() }?.itemsDisabledIndices(*mItemDisables) builder.itemsCallbackSingleChoice(itemPrefIndex ?: mItemDefaultIndex) { d, _, which, _ -> if (itemPrefIndex != which) { @@ -119,7 +122,9 @@ open class MaterialListPreference : MaterialDialogPreference { NotAskAgainDialog.Builder(prefContext, "prompt_\$_${key}") .title(R.string.text_prompt) .content(content) - .positiveText(R.string.text_ok) + .widgetThemeColor() + .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .dismissListener { onChangeConfirmed(getDialog()) } .show() } diff --git a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialPreference.kt b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialPreference.kt index 24c74e3f..9ee6ab8c 100644 --- a/app/src/main/java/org/autojs/autojs/theme/preference/MaterialPreference.kt +++ b/app/src/main/java/org/autojs/autojs/theme/preference/MaterialPreference.kt @@ -51,4 +51,6 @@ open class MaterialPreference : androidx.preference.Preference, LongClickablePre protected fun getAttrTextArray(a: TypedArray, index: Int): Array? = a.getTextArray(index) + protected fun getAttrColor(a: TypedArray, index: Int): Int? = a.getColor(index, -1) + } diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorCheckBox.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorCheckBox.kt new file mode 100644 index 00000000..815bf455 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorCheckBox.kt @@ -0,0 +1,40 @@ +package org.autojs.autojs.theme.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.CheckBox +import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.theme.ThemeColorMutable + +/** + * Created by SuperMonster003 on May 8, 2025. + */ +class ThemeColorCheckBox : CheckBox, ThemeColorMutable { + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { + init() + } + + private fun init() { + ThemeColorManager.add(this) + } + + override fun setThemeColor(color: ThemeColor) { + ThemeColorHelper.setColorPrimary(this, color.colorPrimary, true) + } + +} diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorImageViewCompat.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorImageViewCompat.kt index db94ea14..a1f66f2e 100644 --- a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorImageViewCompat.kt +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorImageViewCompat.kt @@ -5,8 +5,11 @@ import android.graphics.PorterDuff import android.util.AttributeSet import androidx.appcompat.widget.AppCompatImageView import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.theme.ThemeColorManager.add import org.autojs.autojs.theme.ThemeColorMutable +import org.autojs.autojs.util.ColorUtils +import org.autojs.autojs6.R /** * Created by Stardust on May 10, 2017. @@ -35,20 +38,15 @@ class ThemeColorImageViewCompat : AppCompatImageView, ThemeColorMutable { override fun setThemeColor(color: ThemeColor) { if (mColor != color.colorPrimary) { mColor = color.colorPrimary - setColor(color.colorPrimary) + ThemeColorHelper.setThemeColorPrimary(this, true) } } override fun setImageResource(resId: Int) { super.setImageResource(resId) if (mColor != 0) { - setColor(mColor) + ThemeColorHelper.setThemeColorPrimary(this, true) } } - private fun setColor(color: Int) { - @Suppress("DEPRECATION") - drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN) - } - } \ No newline at end of file diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorRadioButton.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorRadioButton.kt new file mode 100644 index 00000000..9836fd96 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorRadioButton.kt @@ -0,0 +1,40 @@ +package org.autojs.autojs.theme.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.RadioButton +import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.theme.ThemeColorMutable + +/** + * Created by SuperMonster003 on May 6, 2025. + */ +class ThemeColorRadioButton : RadioButton, ThemeColorMutable { + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { + init() + } + + private fun init() { + ThemeColorManager.add(this) + } + + override fun setThemeColor(color: ThemeColor) { + ThemeColorHelper.setColorPrimary(this, color.colorPrimary, true) + } + +} diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorSeekBar.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorSeekBar.kt new file mode 100644 index 00000000..64b3b3ab --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorSeekBar.kt @@ -0,0 +1,40 @@ +package org.autojs.autojs.theme.widget + +import android.content.Context +import android.util.AttributeSet +import android.widget.SeekBar +import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.theme.ThemeColorMutable + +/** + * Created by SuperMonster003 on May 8, 2025. + */ +class ThemeColorSeekBar : SeekBar, ThemeColorMutable { + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) { + init() + } + + private fun init() { + ThemeColorManager.add(this) + } + + override fun setThemeColor(color: ThemeColor) { + ThemeColorHelper.setColorPrimary(this, color.colorPrimary, true) + } + +} diff --git a/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorTextInputLayout.kt b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorTextInputLayout.kt new file mode 100644 index 00000000..22c74a8f --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/theme/widget/ThemeColorTextInputLayout.kt @@ -0,0 +1,43 @@ +package org.autojs.autojs.theme.widget + +import android.content.Context +import android.util.AttributeSet +import com.google.android.material.textfield.TextInputLayout +import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.ThemeColorManager +import org.autojs.autojs.theme.ThemeColorMutable + +/** + * Created by SuperMonster003 on May 6, 2025. + */ +class ThemeColorTextInputLayout : TextInputLayout, ThemeColorMutable { + + constructor(context: Context) : super(context) { + init() + } + + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { + init() + } + + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { + init() + } + + private fun init() { + ThemeColorManager.add(this) + } + + override fun onGlobalLayout() { + super.onGlobalLayout() + + val editText = editText ?: return + ThemeColorHelper.setThemeColorPrimary(editText, true) + } + + override fun setThemeColor(color: ThemeColor) { + ThemeColorHelper.setColorPrimary(this, color.colorPrimary, true) + } + +} diff --git a/app/src/main/java/org/autojs/autojs/ui/common/RxDialogs.java b/app/src/main/java/org/autojs/autojs/ui/common/RxDialogs.java index 93a4d54a..047c5005 100644 --- a/app/src/main/java/org/autojs/autojs/ui/common/RxDialogs.java +++ b/app/src/main/java/org/autojs/autojs/ui/common/RxDialogs.java @@ -14,20 +14,32 @@ import io.reactivex.subjects.PublishSubject; */ public class RxDialogs { - public static Observable confirm(Context context, String text) { + public static Observable confirm(Context context, String content) { + return confirm(context, content, 0); + } + + public static Observable confirm(Context context, String content, int positiveColorRes) { PublishSubject subject = PublishSubject.create(); - new MaterialDialog.Builder(context) - .positiveText(R.string.text_ok) + MaterialDialog.Builder builder = new MaterialDialog.Builder(context) + .content(content) .negativeText(R.string.text_cancel) - .onPositive((dialog, which) -> subject.onNext(true)) + .negativeColorRes(R.color.dialog_button_default) .onNegative((dialog, which) -> subject.onNext(false)) - .content(text) - .show(); + .positiveText(R.string.text_ok) + .onPositive((dialog, which) -> subject.onNext(true)); + if (positiveColorRes != 0) { + builder.positiveColorRes(positiveColorRes); + } + builder.show(); return subject; } - public static Observable confirm(Context context, int res) { - return confirm(context, context.getString(res)); + public static Observable confirm(Context context, int contentRes) { + return confirm(context, context.getString(contentRes)); + } + + public static Observable confirm(Context context, int contentRes, int positiveColorRes) { + return confirm(context, context.getString(contentRes), positiveColorRes); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/common/ScriptLoopDialog.java b/app/src/main/java/org/autojs/autojs/ui/common/ScriptLoopDialog.java index 1595f1ed..d42f432b 100644 --- a/app/src/main/java/org/autojs/autojs/ui/common/ScriptLoopDialog.java +++ b/app/src/main/java/org/autojs/autojs/ui/common/ScriptLoopDialog.java @@ -5,9 +5,7 @@ import android.view.LayoutInflater; import android.view.Window; import android.widget.EditText; import android.widget.LinearLayout; - import com.afollestad.materialdialogs.MaterialDialog; - import org.autojs.autojs.app.DialogUtils; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.model.script.Scripts; @@ -40,7 +38,10 @@ public class ScriptLoopDialog { mDialog = new MaterialDialog.Builder(context) .title(R.string.text_run_repeatedly) .customView(view, true) - .positiveText(R.string.text_ok) + .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive((dialog, which) -> startScriptRunningLoop()) .build(); } 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 fbfa80fa..5b874181 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 @@ -21,6 +21,8 @@ import io.reactivex.internal.functions.ObjectHelper; import io.reactivex.schedulers.Schedulers; import io.reactivex.subjects.PublishSubject; import org.autojs.autojs.app.GlobalAppContext; +import org.autojs.autojs.core.pref.Pref; +import org.autojs.autojs.extension.MaterialDialogExtensions; import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.model.explorer.Explorer; import org.autojs.autojs.model.explorer.ExplorerDirPage; @@ -74,6 +76,8 @@ public class ScriptOperations { private final ScriptFile mCurrentDirectory; private final Explorer mExplorer; + private final List availablePrefixes = List.of("test", "untitled", "unnamed", "script"); + public ScriptOperations(Context context, View view, ScriptFile currentDirectory) { mContext = context; mView = view; @@ -139,11 +143,12 @@ public class ScriptOperations { public void newFile() { final AtomicReference dialogRef = new AtomicReference<>(); - MaterialDialog dialog = new MaterialDialog.Builder(mContext) + String presetFileNamePrefix = getNewFileNamePresetPrefill(availablePrefixes.get(Pref.getInt(R.string.key_explorer_file_default_prefix, 0))); + MaterialDialog.Builder builder = new MaterialDialog.Builder(mContext) .title(R.string.text_name) .inputType(InputType.TYPE_CLASS_TEXT) .alwaysCallInputCallback() - .input(getString(R.string.text_please_input_name), getNewFileNamePresetPrefill("test"), false, (d, input) -> { + .input(getString(R.string.text_please_input_name), presetFileNamePrefix, false, (d, input) -> { validateInput(d, d.isPromptCheckBoxChecked() ? JAVASCRIPT.extensionWithDot : null); }) .checkBoxPromptRes(R.string.text_js_file, true, (buttonView, isChecked) -> { @@ -153,6 +158,7 @@ public class ScriptOperations { } }) .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive((d, which) -> { assert d.getInputEditText() != null; boolean createJs = d.isPromptCheckBoxChecked() || d.getInputEditText().getText().toString().endsWith(JAVASCRIPT.extensionWithDot); @@ -169,14 +175,15 @@ public class ScriptOperations { // ! [Aa] 大小写切换图标支持点击循环切换 // ! [A/文] 语言图标支持点击循环切换 // ! [+] 添加图标支持添加自定义项目 (max 限制) - MaterialDialog dialogDefaultPrefix = new MaterialDialog.Builder(mContext) + MaterialDialog.Builder builderDefaultPrefix = new MaterialDialog.Builder(mContext) .title(R.string.text_default_prefix) // TODO 多语言支持? 英文+当前 // TODO 大小写支持? FirstCharUpperCase/UpperCase/LowerCase // TODO 自定义前缀 // TODO 添加 "无/禁用" - .items(List.of("test", "untitled", "unnamed", "script")) - .itemsCallbackSingleChoice(0, (dDefaultPrefix, view, i, text) -> { + .items(availablePrefixes) + .itemsCallbackSingleChoice(Pref.getInt(R.string.key_explorer_file_default_prefix, 0), (dDefaultPrefix, view, i, text) -> { + Pref.putInt(R.string.key_explorer_file_default_prefix, i); EditText editText = dialogRef.get().getInputEditText(); if (editText != null) { editText.setText(getNewFileNamePresetPrefill(text)); @@ -185,12 +192,15 @@ public class ScriptOperations { return true; }) .positiveText(R.string.dialog_button_confirm) - .negativeText(R.string.dialog_button_back) - .build(); + .positiveColorRes(R.color.dialog_button_attraction) + .negativeText(R.string.dialog_button_back); + MaterialDialogExtensions.choiceWidgetThemeColor(builderDefaultPrefix); + MaterialDialog dialogDefaultPrefix = builderDefaultPrefix.build(); showDialog(dialogDefaultPrefix); }) - .autoDismiss(false) - .build(); + .autoDismiss(false); + MaterialDialogExtensions.widgetThemeColor(builder); + MaterialDialog dialog = builder.build(); dialogRef.set(dialog); showDialog(fixCheckBoxGravity(dialog)); @@ -313,19 +323,21 @@ public class ScriptOperations { private Observable showNameInputDialog(String prefix, MaterialDialog.InputCallback textWatcher) { final PublishSubject input = PublishSubject.create(); - showDialog(new MaterialDialog.Builder(mContext) + MaterialDialog.Builder builder = new MaterialDialog.Builder(mContext) .title(R.string.text_name) .inputType(InputType.TYPE_CLASS_TEXT) .alwaysCallInputCallback() .input(getString(R.string.text_please_input_name), prefix, false, textWatcher) .negativeText(R.string.dialog_button_cancel) .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive((dialog, which) -> { input.onNext(Objects.requireNonNull(dialog.getInputEditText()).getText().toString()); input.onComplete(); }) - .canceledOnTouchOutside(false) - .build()); + .canceledOnTouchOutside(false); + MaterialDialogExtensions.widgetThemeColor(builder); + showDialog(builder.build()); return input; } @@ -395,12 +407,14 @@ public class ScriptOperations { return; } String content = mContext.getString(R.string.text_old_path) + ": " + oldPath + "\n" - + mContext.getString(R.string.text_new_path) + ": " + newPath; + + mContext.getString(R.string.text_new_path) + ": " + newPath; new MaterialDialog.Builder(mContext) .title(mContext.getString(R.string.text_prompt)) .content(content) .negativeText(R.string.text_cancel) + .negativeColorRes(R.color.dialog_button_default) .positiveText(R.string.text_ok) + .positiveColorRes(R.color.dialog_button_warn) .onPositive((dialog, which) -> setAsWorkingDirNow(scriptFile)) .build() .show(); @@ -448,7 +462,7 @@ public class ScriptOperations { if (!new File(savePath).exists()) { return Observable.just(savePath); } - return RxDialogs.confirm(mContext, R.string.confirm_overwrite_file) + return RxDialogs.confirm(mContext, R.string.confirm_overwrite_file, R.color.dialog_button_caution) .flatMap(yes -> { if (yes) { if (!new File(savePath).delete()) { @@ -478,6 +492,7 @@ public class ScriptOperations { .singleChoice(file -> importFile(file.getPath()).subscribe()) .title(R.string.text_select_file_to_import) .positiveText(R.string.text_ok) + .positiveColorRes(R.color.dialog_button_attraction) .show(); } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt index e658cac8..d4dc2f3b 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.kt @@ -75,10 +75,11 @@ open class EditActivity : BaseActivity(), DelegateHost, PermissionRequestProxyAc private fun onLoadFileError(message: String?) { MaterialDialog.Builder(this) .title(getString(R.string.text_cannot_read_file)) - .content(message ?: "") + .apply { message?.let(::content) } .positiveText(R.string.text_exit) - .cancelable(false) + .positiveColorRes(R.color.dialog_button_failure) .onPositive { _, _ -> finish() } + .cancelable(false) .show() } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java index 61bbe184..b2fa37a6 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorMenu.java @@ -12,6 +12,7 @@ import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; import org.autojs.autojs.core.pref.Language; import org.autojs.autojs.core.pref.Pref; +import org.autojs.autojs.extension.MaterialDialogExtensions; import org.autojs.autojs.model.indices.AndroidClass; import org.autojs.autojs.model.indices.ClassSearchingItem; import org.autojs.autojs.pio.PFiles; @@ -57,9 +58,9 @@ public class EditorMenu { return tryDoing(mEditorView::forceStop); } return onEditOptionsSelected(item) - || onJumpOptionsSelected(item) - || onMoreOptionsSelected(item) - || onDebugOptionsSelected(item); + || onJumpOptionsSelected(item) + || onMoreOptionsSelected(item) + || onDebugOptionsSelected(item); } private boolean onDebugOptionsSelected(MenuItem item) { @@ -69,11 +70,13 @@ public class EditorMenu { return true; } if (itemId == R.id.action_launch_debugger) { - new NotAskAgainDialog.Builder(mEditorView.getContext(), "editor.debug.long_click_hint") + var builder = new NotAskAgainDialog.Builder(mEditorView.getContext(), "editor.debug.long_click_hint") .title(R.string.text_prompt) .content(R.string.hint_long_click_run_to_debug) - .positiveText(R.string.text_ok) - .show(); + .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default); + MaterialDialogExtensions.widgetThemeColor(builder); + builder.show(); return tryDoing(mEditorView::debug); } if (itemId == R.id.action_remove_all_breakpoints) { @@ -169,9 +172,12 @@ public class EditorMenu { new MaterialDialog.Builder(mContext) .title(title) .content(desc) - .positiveText(R.string.text_copy) - .negativeText(R.string.text_en_import) .neutralText(R.string.text_view_docs) + .neutralColorRes(R.color.dialog_button_hint) + .negativeText(R.string.text_en_import) + .negativeColorRes(R.color.dialog_button_hint) + .positiveText(R.string.text_copy) + .positiveColorRes(R.color.dialog_button_hint) .onPositive((ignored, which) -> { ClipboardUtils.setClip(mContext, desc); ViewUtils.showToast(mContext, R.string.text_already_copied_to_clip); @@ -234,11 +240,15 @@ public class EditorMenu { // // Hint dialog. // }) .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) .onNegative((dialog, which) -> dialog.dismiss()) .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive((dialog, which) -> dialog.dismiss()) .autoDismiss(false); + MaterialDialogExtensions.choiceWidgetThemeColor(builder); + // TODO by SuperMonster003 on Oct 17, 2022. // ! Implementation for "scale view". // ! zh-CN: 实现 "scale view". @@ -302,7 +312,7 @@ public class EditorMenu { private void showJumpDialog(final int lineCount) { String hint = "1 - " + lineCount; - new MaterialDialog.Builder(mContext) + MaterialDialog.Builder builder = new MaterialDialog.Builder(mContext) .title(R.string.text_jump_to_line) .input(hint, "", (dialog, input) -> { if (TextUtils.isEmpty(input)) { @@ -315,8 +325,12 @@ public class EditorMenu { /* Ignored. */ } }) - .inputType(InputType.TYPE_CLASS_NUMBER) - .show(); + .inputType(InputType.TYPE_CLASS_NUMBER); + builder.positiveColorRes(R.color.dialog_button_attraction); + builder.negativeText(R.string.dialog_button_cancel); + builder.negativeColorRes(R.color.dialog_button_default); + MaterialDialogExtensions.widgetThemeColor(builder); + builder.show(); } @SuppressLint("StringFormatMatches") @@ -364,9 +378,12 @@ public class EditorMenu { private void findOrReplace() { mEditor.getSelection() .observeOn(AndroidSchedulers.mainThread()) - .subscribe(s -> new FindOrReplaceDialogBuilder(mContext, mEditorView) - .setQueryIfNotEmpty(s) - .show()); + .subscribe(s -> { + FindOrReplaceDialogBuilder builder = new FindOrReplaceDialogBuilder(mContext, mEditorView) + .setQueryIfNotEmpty(s); + builder.positiveColorRes(R.color.dialog_button_attraction); + builder.show(); + }); } private void copyAll() { diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt index 98fb24b6..7606b315 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.kt @@ -48,6 +48,7 @@ import org.autojs.autojs.pio.PFiles.read import org.autojs.autojs.pio.PFiles.write import org.autojs.autojs.core.pref.Pref.getEditorTextSize import org.autojs.autojs.core.pref.Pref.setEditorTextSize +import org.autojs.autojs.extension.MaterialDialogExtensions.choiceWidgetThemeColor import org.autojs.autojs.storage.file.TmpScriptFiles import org.autojs.autojs.tool.Callback import org.autojs.autojs.ui.doc.ManualDialog @@ -509,6 +510,7 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag MaterialDialog.Builder(context) .title(R.string.text_editor_theme) .items(themes) + .choiceWidgetThemeColor() .itemsCallbackSingleChoice(i) { _, _, which, _ -> themes[which]?.let { setTheme(it) @@ -516,6 +518,10 @@ class EditorView : LinearLayout, OnHintClickListener, ClickCallback, ToolbarFrag } true } + .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .show() } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/TextSizeSettingDialogBuilder.java b/app/src/main/java/org/autojs/autojs/ui/edit/TextSizeSettingDialogBuilder.java index aeb15db8..23eeb83e 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/TextSizeSettingDialogBuilder.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/TextSizeSettingDialogBuilder.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import com.afollestad.materialdialogs.MaterialDialog; +import org.autojs.autojs.theme.ThemeColorHelper; import org.autojs.autojs6.R; import org.autojs.autojs6.databinding.DialogTextSizeSettingBinding; @@ -55,8 +56,10 @@ public class TextSizeSettingDialogBuilder extends MaterialDialog.Builder impleme neutralColorRes(R.color.dialog_button_reset); onNeutral((dialog, which) -> initialValue(Integer.parseInt(getContext().getString(R.string.text_text_size_default_value)))); negativeText(R.string.text_cancel); + negativeColorRes(R.color.dialog_button_default); onNegative((dialog, which) -> dialog.dismiss()); positiveText(R.string.text_ok); + positiveColorRes(R.color.dialog_button_attraction); onPositive((dialog, which) -> dialog.dismiss()); } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/debug/DebugBar.java b/app/src/main/java/org/autojs/autojs/ui/edit/debug/DebugBar.java index c7a554b6..43282431 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/debug/DebugBar.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/debug/DebugBar.java @@ -117,10 +117,12 @@ public class DebugBar extends FrameLayout { new MaterialDialog.Builder(getContext()) .title(variable.getDisplayName()) .content(variable.getValue()) + .neutralText(R.string.text_copy_value) + .neutralColorRes(R.color.dialog_button_hint) + .onNeutral((dialog, which) -> ClipboardUtils.setClip(getContext(), variable.getValue())) .positiveText(R.string.text_ok) - .negativeText(R.string.text_copy_value) + .positiveColorRes(R.color.dialog_button_default) .autoDismiss(true) - .onNegative((dialog, which) -> ClipboardUtils.setClip(getContext(), variable.getValue())) .show(); } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.kt b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.kt index cc8bd714..5830d2c7 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.kt +++ b/app/src/main/java/org/autojs/autojs/ui/edit/editor/CodeEditor.kt @@ -14,6 +14,7 @@ import org.autojs.autojs.core.pref.Pref.getEditorTextSize import org.autojs.autojs.core.pref.Pref.getString import org.autojs.autojs.core.pref.Pref.setEditorTextSize import org.autojs.autojs.script.JsBeautifier +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.ui.edit.theme.Theme import org.autojs.autojs.util.ClipboardUtils.setClip import org.autojs.autojs.util.DisplayUtils.pxToSp @@ -60,6 +61,7 @@ class CodeEditor : HVScrollView { val codeEditText: CodeEditText = binding.codeEditText.also { it.addTextChangedListener(AutoIndent(it)) lastTextSize = getEditorTextSize(pxToSp(it.textSize).toInt()) + ThemeColorHelper.setThemeColorPrimary(it, true) } val lineCount diff --git a/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.kt b/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.kt index c695d927..15429455 100644 --- a/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/error/ErrorReportActivity.kt @@ -60,13 +60,15 @@ class ErrorReportActivity : BaseActivity() { MaterialDialog.Builder(this) .title(R.string.text_app_crashed) .content(R.string.crash_feedback) - .positiveText(R.string.text_exit) - .negativeText(R.string.text_copy_debug_info) - .onPositive { _, _ -> exit() } + .neutralText(R.string.text_copy_debug_info) + .neutralColorRes(R.color.dialog_button_hint) .onNegative { _, _ -> copyToClip(errorMessage) exitAfter(1500) } + .positiveText(R.string.text_exit) + .positiveColorRes(R.color.dialog_button_failure) + .onPositive { _, _ -> exit() } .cancelable(false) .show() } 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 45992cd7..2c94b71f 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 @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.util.Log +import android.view.ContextThemeWrapper import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -28,6 +29,7 @@ import org.autojs.autojs.core.pref.Pref.putInt import org.autojs.autojs.core.pref.Pref.putLinkedList import org.autojs.autojs.core.pref.Pref.putString import org.autojs.autojs.core.pref.Pref.remove +import org.autojs.autojs.extension.ViewExtensions.setForceShowIconCompat import org.autojs.autojs.external.fileprovider.AppFileProvider import org.autojs.autojs.groundwork.WrapContentGridLayoutManger import org.autojs.autojs.model.explorer.Explorer @@ -44,6 +46,7 @@ import org.autojs.autojs.model.script.Scripts import org.autojs.autojs.pio.PFile import org.autojs.autojs.pio.PFiles import org.autojs.autojs.project.ProjectConfig +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.theme.ThemeColorManagerCompat import org.autojs.autojs.theme.widget.ThemeColorSwipeRefreshLayout import org.autojs.autojs.ui.common.ScriptLoopDialog @@ -53,6 +56,10 @@ import org.autojs.autojs.ui.main.scripts.ApkInfoDialogManager import org.autojs.autojs.ui.main.scripts.MediaInfoDialogManager import org.autojs.autojs.ui.project.BuildActivity import org.autojs.autojs.ui.viewmodel.ExplorerItemManager +import org.autojs.autojs.ui.viewmodel.ExplorerItemManager.Companion.SORT_TYPE_DATE +import org.autojs.autojs.ui.viewmodel.ExplorerItemManager.Companion.SORT_TYPE_NAME +import org.autojs.autojs.ui.viewmodel.ExplorerItemManager.Companion.SORT_TYPE_SIZE +import org.autojs.autojs.ui.viewmodel.ExplorerItemManager.Companion.SORT_TYPE_TYPE import org.autojs.autojs.ui.widget.BindableViewHolder import org.autojs.autojs.ui.widget.FirstCharView import org.autojs.autojs.util.ColorUtils @@ -548,23 +555,43 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef explorerItemManager = newManager notifyDataSetChanged() isRefreshing = false - post { scrollToPositionSmoothly() } + post { scrollToPositionImmediately() } } } private fun scrollToPositionSmoothly() { - val layoutManager = explorerItemListView!!.layoutManager + val recyclerView = explorerItemListView ?: return + val layoutManager = recyclerView.layoutManager val position = currentPageState.scrollY val smoothScroller: RecyclerView.SmoothScroller = object : LinearSmoothScroller(context) { override fun getVerticalSnapPreference(): Int { return SNAP_TO_START } + }.apply { targetPosition = position } + + when (layoutManager) { + null -> recyclerView.smoothScrollToPosition(position) + is GridLayoutManager -> layoutManager.startSmoothScroll(smoothScroller) + is LinearLayoutManager -> layoutManager.startSmoothScroll(smoothScroller) + else -> layoutManager.startSmoothScroll(smoothScroller) } - smoothScroller.targetPosition = position - layoutManager?.startSmoothScroll(smoothScroller) } + private fun scrollToPositionImmediately() { + val recyclerView = explorerItemListView ?: return + val layoutManager = recyclerView.layoutManager + val position = currentPageState.scrollY + + when (layoutManager) { + null -> recyclerView.scrollToPosition(position) + is GridLayoutManager -> layoutManager.scrollToPositionWithOffset(position, 0) + is LinearLayoutManager -> layoutManager.scrollToPositionWithOffset(position, 0) + else -> layoutManager.scrollToPosition(position) + } + } + + private inner class ExplorerAdapter : RecyclerView.Adapter>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BindableViewHolder { @@ -760,7 +787,7 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef ColorUtils.adjustColorForContrast( context.getColor(R.color.item_background_dark), ThemeColorManagerCompat.getColorPrimary(), - 1.15 + 1.15, ) }.map { themeColorForContrast -> listOf( @@ -990,36 +1017,34 @@ open class ExplorerView : ThemeColorSwipeRefreshLayout, SwipeRefreshLayout.OnRef } } binding.sortType.setOnClickListener { - val popupMenu = PopupMenu(context, binding.sortType) - popupMenu.inflate(R.menu.menu_sort_options) + val themedCtx = ContextThemeWrapper(context, R.style.PopupMenu_HideIndicator) + val popupMenu = PopupMenu(themedCtx, binding.sortType).apply { + inflate(R.menu.menu_sort_options) + setForceShowIconCompat() + } isDirSortMenuShowing = mIsDir val currentSortType = if (mIsDir) explorerItemManager.dirSortType else explorerItemManager.fileSortType - when (currentSortType) { - ExplorerItemManager.SORT_TYPE_DATE -> popupMenu.menu.findItem(R.id.action_sort_by_date).isChecked = true - ExplorerItemManager.SORT_TYPE_SIZE -> popupMenu.menu.findItem(R.id.action_sort_by_size).isChecked = true - ExplorerItemManager.SORT_TYPE_TYPE -> popupMenu.menu.findItem(R.id.action_sort_by_type).isChecked = true - else -> popupMenu.menu.findItem(R.id.action_sort_by_name).isChecked = true + val initItemId = when (currentSortType) { + SORT_TYPE_DATE -> R.id.action_sort_by_date + SORT_TYPE_SIZE -> R.id.action_sort_by_size + SORT_TYPE_TYPE -> R.id.action_sort_by_type + else -> R.id.action_sort_by_name } + popupMenu.menu.findItem(initItemId).isChecked = true + ThemeColorHelper.setThemeColorPrimary(popupMenu.menu, themedCtx, context.getColor(R.color.item_background), initItemId) popupMenu.setOnMenuItemClickListener { item: MenuItem -> item.isChecked = true when (item.itemId) { - R.id.action_sort_by_name -> { - sort(ExplorerItemManager.SORT_TYPE_NAME, isDirSortMenuShowing, true) - } - R.id.action_sort_by_date -> { - sort(ExplorerItemManager.SORT_TYPE_DATE, isDirSortMenuShowing, false) - } - R.id.action_sort_by_size -> { - sort(ExplorerItemManager.SORT_TYPE_SIZE, isDirSortMenuShowing, false) - } - R.id.action_sort_by_type -> { - sort(ExplorerItemManager.SORT_TYPE_TYPE, isDirSortMenuShowing, true) - } - else -> null - } != null + R.id.action_sort_by_name -> sort(SORT_TYPE_NAME, isDirSortMenuShowing, true) + R.id.action_sort_by_date -> sort(SORT_TYPE_DATE, isDirSortMenuShowing, false) + R.id.action_sort_by_size -> sort(SORT_TYPE_SIZE, isDirSortMenuShowing, false) + R.id.action_sort_by_type -> sort(SORT_TYPE_TYPE, isDirSortMenuShowing, true) + } + ThemeColorHelper.setThemeColorPrimary(popupMenu.menu, themedCtx, true, item.itemId) + true } popupMenu.show() } diff --git a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java index c7b2d196..48cff871 100644 --- a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java +++ b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerItemViewHolder.java @@ -10,6 +10,7 @@ import org.autojs.autojs.core.ui.widget.JsCheckBox; import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.pio.PFile; import org.autojs.autojs.pio.PFiles; +import org.autojs.autojs.theme.ThemeColorHelper; import org.autojs.autojs.theme.ThemeColorManagerCompat; import org.autojs.autojs.ui.explorer.ExplorerViewHelper; import org.autojs.autojs.ui.widget.BindableViewHolder; @@ -45,16 +46,9 @@ class ExplorerItemViewHolder extends BindableViewHolder { JsCheckBox checkbox = listFileBinding.checkbox; int itemBackgroundDarkColor = context.getColor(R.color.item_background_dark); - int themePrimaryColor = ThemeColorManagerCompat.getColorPrimary(); + int itemIconThemeColorForContrast = ColorUtils.adjustThemeColorForContrast(itemBackgroundDarkColor, 1.15); - int checkBoxCheckedThemeColorForContrast = ColorUtils.adjustColorForContrast(itemBackgroundDarkColor, themePrimaryColor, 1.9); - int checkBoxUncheckedCheckedThemeColorForContrast = ColorUtils.adjustColorForContrast(itemBackgroundDarkColor, themePrimaryColor, 1.4); - int itemIconThemeColorForContrast = ColorUtils.adjustColorForContrast(itemBackgroundDarkColor, themePrimaryColor, 1.15); - - checkbox.setButtonTintList(new ColorStateList( - new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}}, - new int[]{checkBoxCheckedThemeColorForContrast, checkBoxUncheckedCheckedThemeColorForContrast} - )); + ThemeColorHelper.setThemeColorPrimary(checkbox, itemBackgroundDarkColor); listFileBinding.name.setText(ExplorerViewHelper.getDisplayName(context, explorerItem)); listFileBinding.item.setOnClickListener(view -> checkbox.toggle()); diff --git a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerPageViewHolder.java b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerPageViewHolder.java index 6ff2ee6d..5dca2be5 100644 --- a/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerPageViewHolder.java +++ b/app/src/main/java/org/autojs/autojs/ui/filechooser/ExplorerPageViewHolder.java @@ -1,10 +1,11 @@ package org.autojs.autojs.ui.filechooser; +import android.content.Context; import android.view.View; - import androidx.annotation.NonNull; - +import com.afollestad.materialdialogs.util.DialogUtils; import org.autojs.autojs.model.explorer.ExplorerPage; +import org.autojs.autojs.theme.ThemeColorHelper; import org.autojs.autojs.ui.explorer.ExplorerViewHelper; import org.autojs.autojs.ui.widget.BindableViewHolder; import org.autojs.autojs6.databinding.FileChooseListDirectoryBinding; @@ -26,12 +27,20 @@ class ExplorerPageViewHolder extends BindableViewHolder { @Override public void bind(Object item, int position) { if (!(item instanceof ExplorerPage explorerPage)) return; + + Context context = fileChooseListView.getContext(); + mExplorerPage = explorerPage; - binding.name.setText(ExplorerViewHelper.getDisplayName(fileChooseListView.getContext(), explorerPage)); + binding.name.setText(ExplorerViewHelper.getDisplayName(context, explorerPage)); binding.icon.setImageResource(ExplorerViewHelper.getIconRes(explorerPage)); if (fileChooseListView.getCanChooseDir()) { binding.checkbox.setVisibility(View.VISIBLE); binding.checkbox.setChecked(fileChooseListView.getSelectedFiles().containsKey(explorerPage.toScriptFile()), false); + var defaultMaterialDialogBackgroundColor = DialogUtils.resolveColor( + context, + com.afollestad.materialdialogs.R.attr.md_background_color, + DialogUtils.resolveColor(context, android.R.attr.colorBackgroundFloating)); + ThemeColorHelper.setThemeColorPrimary(binding.checkbox, defaultMaterialDialogBackgroundColor); } else { binding.checkbox.setVisibility(View.GONE); } diff --git a/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooserDialogBuilder.java b/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooserDialogBuilder.java index 6384f9dd..f7879f5a 100644 --- a/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooserDialogBuilder.java +++ b/app/src/main/java/org/autojs/autojs/ui/filechooser/FileChooserDialogBuilder.java @@ -1,12 +1,12 @@ package org.autojs.autojs.ui.filechooser; import android.content.Context; - +import android.widget.CheckBox; import androidx.annotation.NonNull; import androidx.annotation.StringRes; - import com.afollestad.materialdialogs.MaterialDialog; - +import io.reactivex.Observable; +import io.reactivex.subjects.PublishSubject; import org.autojs.autojs.app.DialogUtils; import org.autojs.autojs.model.explorer.Explorer; import org.autojs.autojs.model.explorer.ExplorerDirPage; @@ -14,6 +14,7 @@ import org.autojs.autojs.model.explorer.ExplorerFileProvider; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.Scripts; import org.autojs.autojs.pio.PFile; +import org.autojs.autojs.theme.ThemeColorHelper; import org.autojs.autojs6.R; import java.io.File; @@ -21,9 +22,6 @@ import java.io.FileFilter; import java.util.Collections; import java.util.List; -import io.reactivex.Observable; -import io.reactivex.subjects.PublishSubject; - /** * Created by Stardust on Oct 19, 2017. */ @@ -50,9 +48,14 @@ public class FileChooserDialogBuilder extends MaterialDialog.Builder { super(context); mFileChooseListView = new FileChooseListView(context); mFileChooseListView.isProjectRecognitionEnabled = false; + if (mFileChooseListView.findViewById(R.id.checkbox) instanceof CheckBox checkbox) { + ThemeColorHelper.setThemeColorPrimary(checkbox, backgroundColor); + } customView(mFileChooseListView, false); - positiveText(R.string.text_ok); - negativeText(R.string.text_cancel); + negativeText(R.string.dialog_button_cancel); + negativeColorRes(R.color.dialog_button_default); + positiveText(R.string.dialog_button_confirm); + positiveColorRes(R.color.dialog_button_attraction); onPositive((dialog, which) -> notifySelected()); cancelable(false); } 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 2f7de8b2..4934241b 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 @@ -118,7 +118,8 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp final MaterialDialog dialog = new AppLevelThemeDialogBuilder(mContext) .title(mContext.getString(R.string.text_run_script)) .customView(explorerView, false) - .positiveText(mContext.getString(R.string.text_cancel)) + .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .cancelable(false) .build(); explorerView.setOnItemOperateListener(item -> dialog.dismiss()); @@ -130,6 +131,7 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp .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())) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_failure) .show(); } }); @@ -146,7 +148,8 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp DialogUtils.showDialog(new AppLevelThemeDialogBuilder(mContext) .title(mContext.getString(R.string.text_no_root_access)) .content(mContext.getString(R.string.no_root_access_for_record)) - .positiveText(mContext.getString(R.string.dialog_button_quit)) + .positiveText(R.string.dialog_button_quit) + .positiveColorRes(R.color.dialog_button_failure) .build()); } else { mRecorder.start(); diff --git a/app/src/main/java/org/autojs/autojs/ui/floating/CodeGenerateDialog.java b/app/src/main/java/org/autojs/autojs/ui/floating/CodeGenerateDialog.java index 7b0e0dce..510e406f 100644 --- a/app/src/main/java/org/autojs/autojs/ui/floating/CodeGenerateDialog.java +++ b/app/src/main/java/org/autojs/autojs/ui/floating/CodeGenerateDialog.java @@ -90,7 +90,9 @@ public class CodeGenerateDialog extends AppLevelThemeDialogBuilder { .title(R.string.text_generated_code) .content(code) .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) .positiveText(R.string.dialog_button_copy) + .positiveColorRes(R.color.dialog_button_hint) .onPositive(((dialog, which) -> { ClipboardUtils.setClip(context, code); ViewUtils.showToast(context, R.string.text_already_copied_to_clip); @@ -101,6 +103,7 @@ public class CodeGenerateDialog extends AppLevelThemeDialogBuilder { .title(R.string.text_prompt) .content(R.string.text_failed_to_generate) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_failure) .build()); } } diff --git a/app/src/main/java/org/autojs/autojs/ui/keystore/ManageKeyStoreActivity.kt b/app/src/main/java/org/autojs/autojs/ui/keystore/ManageKeyStoreActivity.kt index 120f67b2..2d020d19 100644 --- a/app/src/main/java/org/autojs/autojs/ui/keystore/ManageKeyStoreActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/keystore/ManageKeyStoreActivity.kt @@ -62,7 +62,10 @@ class ManageKeyStoreActivity : BaseActivity() { override fun onDeleteButtonClicked(keyStore: KeyStore) { MaterialDialog.Builder(this@ManageKeyStoreActivity) .title(getString(R.string.text_confirm_to_delete)) - .positiveText(R.string.text_ok).negativeText(R.string.text_cancel) + .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_caution) .onPositive { _: MaterialDialog, _: DialogAction -> deleteKeyStore(keyStore) }.show() @@ -128,7 +131,10 @@ class ManageKeyStoreActivity : BaseActivity() { R.id.action_delete_all -> { MaterialDialog.Builder(this@ManageKeyStoreActivity) .title(getString(R.string.text_delete_all)) - .positiveText(R.string.text_ok).negativeText(R.string.text_cancel) + .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) + .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_caution) .onPositive { _: MaterialDialog, _: DialogAction -> deleteAllKeyStores() }.show() diff --git a/app/src/main/java/org/autojs/autojs/ui/keystore/NewKeyStoreDialog.kt b/app/src/main/java/org/autojs/autojs/ui/keystore/NewKeyStoreDialog.kt index 35616908..0c422cce 100644 --- a/app/src/main/java/org/autojs/autojs/ui/keystore/NewKeyStoreDialog.kt +++ b/app/src/main/java/org/autojs/autojs/ui/keystore/NewKeyStoreDialog.kt @@ -12,6 +12,8 @@ import android.view.WindowManager import android.widget.ArrayAdapter import android.widget.LinearLayout import androidx.fragment.app.DialogFragment +import org.autojs.autojs.theme.ThemeColorHelper +import org.autojs.autojs.theme.ThemeColorManager import org.autojs.autojs6.R import org.autojs.autojs6.databinding.DialogNewKeyStoreBinding @@ -195,8 +197,11 @@ open class NewKeyStoreDialog( dismiss() } - binding.moreOptions.setOnCheckedChangeListener { _, isChecked -> - binding.moreOptionsContainer.visibility = if (isChecked) View.VISIBLE else View.GONE + binding.moreOptions.apply { + ThemeColorHelper.setColorPrimary(this, ThemeColorManager.colorPrimary, true) + setOnCheckedChangeListener { _, isChecked -> + binding.moreOptionsContainer.visibility = if (isChecked) View.VISIBLE else View.GONE + } } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/drawer/CommandBasedPermissionItemHelper.kt b/app/src/main/java/org/autojs/autojs/ui/main/drawer/CommandBasedPermissionItemHelper.kt index e90a058f..8f89c009 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/drawer/CommandBasedPermissionItemHelper.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/drawer/CommandBasedPermissionItemHelper.kt @@ -137,8 +137,10 @@ interface CommandBasedPermissionItemHelper : PermissionItemHelper, IPermissionRo } } .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) .onNegative { dialog, _ -> dialog.dismiss() } .positiveText(R.string.text_copy_command) + .positiveColorRes(R.color.dialog_button_hint) .onPositive { dialog, _ -> ClipboardUtils.setClip(context, mCommand) val view = dialog.view diff --git a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerMenuToggleableItem.kt b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerMenuToggleableItem.kt index 686d958a..85e41c41 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerMenuToggleableItem.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/drawer/DrawerMenuToggleableItem.kt @@ -6,6 +6,7 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import org.autojs.autojs.core.pref.Pref +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor import org.autojs.autojs.ui.common.NotAskAgainDialog import org.autojs.autojs6.R @@ -66,8 +67,11 @@ open class DrawerMenuToggleableItem : DrawerMenuItem, IToggleableItem { NotAskAgainDialog.Builder(mItemHelper.context, key) .title(title) .content(it) + .widgetThemeColor() .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) .positiveText(R.string.dialog_button_continue) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive { _, _ -> isPositiveButtonPressed = true toggle(aimState) diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt index 0afbbd9f..77fda3fc 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/ApkInfoDialogManager.kt @@ -88,7 +88,7 @@ object ApkInfoDialogManager { val installedPackageName: String? = packageName?.let { pkg -> AppUtils.getInstalledVersionInfo(pkg)?.let { versionInfo -> binding.installedVersionParent.isVisible = true - binding.installedVersionValue.setCopyableTextIfAbsent(dialog) { context.getString(R.string.text_full_version_info, versionInfo.versionName, versionInfo.versionCode) } + dialog.setCopyableTextIfAbsent(binding.installedVersionValue) { context.getString(R.string.text_full_version_info, versionInfo.versionName, versionInfo.versionCode) } pkg /* returns as installedPackageName */ } } @@ -99,19 +99,19 @@ object ApkInfoDialogManager { when { versionName != null -> { binding.versionPlaceholderLabel.text = context.getString(R.string.text_version) - binding.versionPlaceholderValue.setCopyableTextIfAbsent(dialog) { context.getString(R.string.text_full_version_info, versionName, versionCode) } + dialog.setCopyableTextIfAbsent(binding.versionPlaceholderValue) { context.getString(R.string.text_full_version_info, versionName, versionCode) } } versionCode != null -> { binding.versionPlaceholderLabel.text = context.getString(R.string.text_version_code) - binding.versionPlaceholderValue.setCopyableTextIfAbsent(dialog) { "$versionCode" } + dialog.setCopyableTextIfAbsent(binding.versionPlaceholderValue) { "$versionCode" } } - else -> binding.versionPlaceholderValue.setCopyableTextIfAbsent(dialog) { null } + else -> dialog.setCopyableTextIfAbsent(binding.versionPlaceholderValue) { null } } - binding.packageNameValue.setCopyableTextIfAbsent(dialog) { packageName } - binding.deviceSdkValue.setCopyableTextIfAbsent(dialog) { "${Build.VERSION.SDK_INT}" } - binding.fileSizeValue.setCopyableTextIfAbsent(dialog) { fileSize } - binding.signatureSchemeValue.setCopyableTextIfAbsent(dialog) { signatureScheme } + dialog.setCopyableTextIfAbsent(binding.packageNameValue) { packageName } + dialog.setCopyableTextIfAbsent(binding.deviceSdkValue) { "${Build.VERSION.SDK_INT}" } + dialog.setCopyableTextIfAbsent(binding.fileSizeValue) { fileSize } + dialog.setCopyableTextIfAbsent(binding.signatureSchemeValue) { signatureScheme } dialog.setIcon(applicationInfo?.apply { sourceDir = apkFilePath @@ -123,10 +123,10 @@ object ApkInfoDialogManager { val apkInfo = getApkInfo(apkFile) - binding.labelNameValue.setCopyableTextIfAbsent(dialog) { apkInfo?.label } - binding.packageNameValue.setCopyableTextIfAbsent(dialog) { apkInfo?.packageName } - binding.minSdkValue.setCopyableTextIfAbsent(dialog) { apkInfo?.minSdkVersion?.toString() } - binding.targetSdkValue.setCopyableTextIfAbsent(dialog) { apkInfo?.targetSdkVersion?.toString() } + dialog.setCopyableTextIfAbsent(binding.labelNameValue) { apkInfo?.label } + dialog.setCopyableTextIfAbsent(binding.packageNameValue) { apkInfo?.packageName } + dialog.setCopyableTextIfAbsent(binding.minSdkValue) { apkInfo?.minSdkVersion?.toString() } + dialog.setCopyableTextIfAbsent(binding.targetSdkValue) { apkInfo?.targetSdkVersion?.toString() } if (apkInfo != null) dialog.getActionButton(DialogAction.NEUTRAL).let { neutralButton -> neutralButton.isVisible = true diff --git a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt index c1a013f4..5afa1538 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt +++ b/app/src/main/java/org/autojs/autojs/ui/main/scripts/MediaInfoDialogManager.kt @@ -255,7 +255,7 @@ object MediaInfoDialogManager { private suspend fun TextView.bindWith(dialog: MaterialDialog, text: String) { withContext(Dispatchers.Main) { - this@bindWith.setCopyableText(dialog) { text } + dialog.setCopyableText(this@bindWith) { text } } } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index a6c1cea6..e5252fe4 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -35,6 +35,7 @@ import net.dongliu.apk.parser.bean.ApkMeta; import org.autojs.autojs.apkbuilder.ApkBuilder; import org.autojs.autojs.apkbuilder.keystore.KeyStore; import org.autojs.autojs.core.pref.Language; +import org.autojs.autojs.extension.MaterialDialogExtensions; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.script.ScriptFile; import org.autojs.autojs.project.ProjectConfig; @@ -410,7 +411,9 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa "- " + getString(R.string.text_download_and_install_autojs6_including_all_abis) + " [" + getString(R.string.text_recommended) + "]\n\n" + getString(R.string.text_download_link_for_autojs6) + ":\n" + getString(R.string.uri_autojs6_download_link)); - builder.positiveText(R.string.dialog_button_dismiss); + builder.positiveText(R.string.text_ok); + builder.positiveColorRes(R.color.dialog_button_hint); + MaterialDialogExtensions.widgetThemeColor(builder); MaterialDialog dialog = builder.show(); if (dialog != null) { TextView contentView = dialog.getContentView(); @@ -712,6 +715,7 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa .dir(initialDir) .chooseDir() .singleChoice(dir -> mOutputPathView.setText(dir.getPath())) + .positiveColorRes(R.color.dialog_button_attraction) .show(); } @@ -848,6 +852,7 @@ public class BuildActivity extends BaseActivity implements ApkBuilder.ProgressCa .title(R.string.text_prompt) .content(content) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_failure) .cancelable(false) .show(); } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.kt b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.kt index ceca2934..3d4a5eaf 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.kt @@ -25,6 +25,7 @@ import org.autojs.autojs.model.project.ProjectTemplate import org.autojs.autojs.pio.PFiles.ensureDir import org.autojs.autojs.pio.PFiles.write import org.autojs.autojs.project.ProjectConfig +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.shortcut.AppsIconSelectActivity import org.autojs.autojs.ui.widget.SimpleTextWatcher @@ -82,6 +83,10 @@ class ProjectConfigActivity : BaseActivity() { mVersionCode = binding.versionCode mMainFileName = binding.mainFileName + binding.defaultStableMode.apply { + ThemeColorHelper.setThemeColorPrimary(this, true) + } + mIcon = binding.appIcon.apply { setOnClickListener { selectIcon() } } @@ -118,7 +123,8 @@ class ProjectConfigActivity : BaseActivity() { if (mProjectConfig == null) { MaterialDialog.Builder(this) .title(R.string.text_invalid_project) - .positiveText(R.string.text_ok) + .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_failure) .dismissListener { finish() } .show() } diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.kt b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.kt index 8aa1eef8..95ec2247 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/settings/AboutActivity.kt @@ -23,6 +23,7 @@ import org.autojs.autojs6.R import org.autojs.autojs6.databinding.ActivityAboutBinding import org.autojs.autojs6.databinding.ActivityAboutFunctionButtonsBinding import androidx.core.net.toUri +import org.autojs.autojs.extension.MaterialDialogExtensions.widgetThemeColor /** * Created by Stardust on Feb 2, 2017. @@ -173,11 +174,13 @@ open class AboutActivity : BaseActivity() { NotAskAgainDialog.Builder(this, key) .title(R.string.text_prompt) .content(R.string.content_github_feedback) + .widgetThemeColor() .negativeText(R.string.dialog_button_cancel) - .positiveText(R.string.dialog_button_continue) + .negativeColorRes(R.color.dialog_button_default) .onNegative { d, _ -> d.dismiss() } - .onPositive { _, _ -> launchGithubIssuesPage() } + .positiveText(R.string.dialog_button_continue) .positiveColorRes(R.color.dialog_button_attraction) + .onPositive { _, _ -> launchGithubIssuesPage() } .show() ?: launchGithubIssuesPage() } diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/DisplayVersionHistoriesActivity.kt b/app/src/main/java/org/autojs/autojs/ui/settings/DisplayVersionHistoriesActivity.kt index c702a76d..73c2265b 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/DisplayVersionHistoriesActivity.kt +++ b/app/src/main/java/org/autojs/autojs/ui/settings/DisplayVersionHistoriesActivity.kt @@ -189,7 +189,7 @@ class DisplayVersionHistoriesActivity : BaseActivity() { .neutralColorRes(R.color.dialog_button_default) .onNegative { dialog, _ -> dialog.dismiss() } .neutralText(R.string.dialog_button_use_default) - .neutralColorRes(R.color.dialog_button_hint) + .neutralColorRes(R.color.dialog_button_reset) .choiceWidgetColor(ThemeColorHelper.getThemeColorStateList(this)) .onNeutral { dialog, _ -> dialog.setSelectedIndices(categories.indices.filter { categories[it] in DEFAULT_FILTER }.toTypedArray()) @@ -215,6 +215,7 @@ class DisplayVersionHistoriesActivity : BaseActivity() { .title(R.string.text_process_log) .content(ProcessLogger.dump()) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_default) .show() val tv = dialog.contentView?.apply { diff --git a/app/src/main/java/org/autojs/autojs/ui/settings/WorkingDirectoryPreference.kt b/app/src/main/java/org/autojs/autojs/ui/settings/WorkingDirectoryPreference.kt index 130fcbff..4c861f7c 100644 --- a/app/src/main/java/org/autojs/autojs/ui/settings/WorkingDirectoryPreference.kt +++ b/app/src/main/java/org/autojs/autojs/ui/settings/WorkingDirectoryPreference.kt @@ -12,13 +12,13 @@ import android.widget.ImageView import android.widget.RadioGroup import androidx.appcompat.widget.LinearLayoutCompat import androidx.appcompat.widget.SwitchCompat -import androidx.preference.Preference.SummaryProvider import com.afollestad.materialdialogs.MaterialDialog import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import org.autojs.autojs.app.DialogUtils import org.autojs.autojs.storage.file.FileObservable +import org.autojs.autojs.theme.ThemeColorHelper import org.autojs.autojs.theme.preference.MaterialPreference import org.autojs.autojs.tool.SimpleObserver import org.autojs.autojs.ui.filechooser.FileChooserDialogBuilder @@ -118,11 +118,11 @@ class WorkingDirectoryPreference : MaterialPreference { mContentView.setText(text) } } - .negativeText(R.string.dialog_button_cancel) + .negativeText(R.string.dialog_button_back) .show() } } - .negativeText(R.string.dialog_button_cancel) + .negativeText(R.string.dialog_button_back) .negativeColorRes(R.color.dialog_button_default) .onNegative { dHistories, _ -> dHistories.dismiss() } .autoDismiss(false) @@ -132,6 +132,7 @@ class WorkingDirectoryPreference : MaterialPreference { .negativeText(R.string.dialog_button_cancel) .onNegative { dialog, _ -> dialog.dismiss() } .positiveText(R.string.dialog_button_confirm) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive { dialog, _ -> val inputPath = mContentView.text.toString() WorkingDirectoryUtils.addIntoHistories(inputPath) @@ -151,7 +152,7 @@ class WorkingDirectoryPreference : MaterialPreference { customView!!.let { mRadioGroupView = it.findViewById(R.id.md_contentRadioGroup) mFileTransferView = it.findViewById(R.id.md_contentFileTransfer) - mFileChooserIconView = it.findViewById(R.id.md_FileChooserIcon).apply { + mFileChooserIconView = it.findViewById(R.id.md_FileChooserIcon).apply { setOnClickListener { val initialDir: String? = try { File(toFullPath(mContentView.text.toString())).path @@ -166,8 +167,9 @@ class WorkingDirectoryPreference : MaterialPreference { .show() } } - mContentView = it.findViewById(R.id.md_contentPath).apply { + mContentView = it.findViewById(R.id.md_contentPath).apply { setText(WorkingDirectoryUtils.relativePath) + ThemeColorHelper.setThemeColorPrimary(this, true) addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { /* Ignored. */ @@ -185,7 +187,7 @@ class WorkingDirectoryPreference : MaterialPreference { } }) } - mSwitchView = it.findViewById(R.id.md_contentSwitch).apply { + mSwitchView = it.findViewById(R.id.md_contentSwitch).apply { setOnCheckedChangeListener { _, isChecked -> mRadioGroupView.visibility = when (isChecked) { true -> View.VISIBLE diff --git a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java index d59a58b2..00aa1c64 100644 --- a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutCreateActivity.java @@ -3,9 +3,10 @@ package org.autojs.autojs.ui.shortcut; import android.annotation.SuppressLint; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.ColorStateList; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Icon; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -17,6 +18,7 @@ import android.widget.TextView; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.content.res.AppCompatResources; import com.afollestad.materialdialogs.MaterialDialog; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -25,8 +27,11 @@ import org.autojs.autojs.external.ScriptIntents; import org.autojs.autojs.external.shortcut.Shortcut; import org.autojs.autojs.external.shortcut.ShortcutActivity; import org.autojs.autojs.model.script.ScriptFile; +import org.autojs.autojs.theme.ThemeColorManager; import org.autojs.autojs.util.BitmapUtils; +import org.autojs.autojs.util.ColorUtils; import org.autojs.autojs.util.ShortcutUtils; +import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs6.R; import org.autojs.autojs6.databinding.ShortcutCreateDialogBinding; @@ -44,6 +49,9 @@ public class ShortcutCreateActivity extends AppCompatActivity { ImageView mIcon; CheckBox mUseAndroidNShortcut; + private int mAdjustedContrastColor; + private int mAdjustedContrastColorConsiderable; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -53,8 +61,17 @@ public class ShortcutCreateActivity extends AppCompatActivity { mName = binding.name; mIcon = binding.icon; + mUseAndroidNShortcut = binding.useAndroidNShortcut; + mAdjustedContrastColor = ColorUtils.adjustColorForContrast(mIcon.getContext().getColor(R.color.window_background), ThemeColorManager.getColorPrimary(), 1.15); + mAdjustedContrastColorConsiderable = ColorUtils.adjustColorForContrast(mIcon.getContext().getColor(R.color.window_background), ThemeColorManager.getColorPrimary(), 2.3); + Drawable background = mIcon.getBackground(); + if (background != null) { + background.setTint(mAdjustedContrastColor); + } + mIcon.setBackground(background); + mIcon.setImageTintList(ColorStateList.valueOf(ViewUtils.getDayOrNightColorByLuminance(this, mAdjustedContrastColor))); mIcon.setOnClickListener(v -> AppsIconSelectActivity.launchForResult(this, 21209)); mScriptFile = (ScriptFile) getIntent().getSerializableExtra(EXTRA_FILE); @@ -62,13 +79,19 @@ public class ShortcutCreateActivity extends AppCompatActivity { } private void showDialog(View view) { - mUseAndroidNShortcut.setVisibility(Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1 - ? View.VISIBLE : View.GONE); + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1) { + mUseAndroidNShortcut.setVisibility(View.VISIBLE); + } else { + mUseAndroidNShortcut.setVisibility(View.GONE); + } mName.setText(mScriptFile.getSimplifiedName()); new MaterialDialog.Builder(this) .customView(view, false) .title(R.string.text_send_shortcut) + .negativeText(R.string.dialog_button_cancel) + .negativeColorRes(R.color.dialog_button_default) .positiveText(R.string.text_ok) + .positiveColorRes(R.color.dialog_button_attraction) .onPositive((dialog, which) -> { createShortcut(); finish(); @@ -78,9 +101,11 @@ public class ShortcutCreateActivity extends AppCompatActivity { } private void createShortcut() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O || - Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1 && mUseAndroidNShortcut.isChecked() - ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createShortcutByShortcutManager(); + return; + } + if (Build.VERSION.SDK_INT == Build.VERSION_CODES.N_MR1 && mUseAndroidNShortcut.isChecked()) { createShortcutByShortcutManager(); return; } @@ -145,6 +170,12 @@ public class ShortcutCreateActivity extends AppCompatActivity { if (packageName != null) { try { mIcon.setImageDrawable(getPackageManager().getApplicationIcon(packageName)); + mIcon.setImageTintList(null); + Drawable background = AppCompatResources.getDrawable(this, R.drawable.shortcut_create_dialog_icon_border); + if (background != null) { + background.setTint(mAdjustedContrastColorConsiderable); + } + mIcon.setBackground(background); mIsDefaultIcon = false; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); diff --git a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt index 5deb1d07..66469271 100644 --- a/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ColorUtils.kt @@ -8,12 +8,11 @@ import android.content.res.ColorStateList import android.graphics.Color import android.view.View import androidx.annotation.ColorInt -import androidx.annotation.ColorRes import androidx.annotation.FloatRange import androidx.core.graphics.ColorUtils -import org.autojs.autojs.app.GlobalAppContext import org.autojs.autojs.core.image.ColorTable import org.autojs.autojs.theme.ThemeColor +import org.autojs.autojs.theme.ThemeColorManager import java.math.RoundingMode import kotlin.math.roundToInt import kotlin.text.RegexOption.IGNORE_CASE @@ -47,9 +46,6 @@ object ColorUtils { return if (uppercase) hex.uppercase() else hex.lowercase() } - @ColorInt - fun fromResources(@ColorRes colorRes: Int) = GlobalAppContext.get().getColor(colorRes) - @JvmStatic @JvmOverloads fun toUnit8(component: Double, takeNumOneAsPercent: Boolean = false) = when { @@ -344,30 +340,45 @@ object ColorUtils { @ColorInt background: Int, @ColorInt reference: Int, minimumContrast: Double = 4.5, + alpha: Double = 1.0, ): Int { - // 如果已经满足对比度要求, 直接返回参考色 + + /* 原色已满足要求, 直接返回. */ if (calculateContrast(background, reference) >= minimumContrast) { - return reference + return applyAlpha(reference, alpha) } - // 转为 HSL 以便调整亮度 - val hsl = FloatArray(3) - ColorUtils.colorToHSL(reference, hsl) + /* 把参考色转成 HSL, 方便按亮度通道调整. */ + val hsl = FloatArray(3).also { ColorUtils.colorToHSL(reference, it) } - // 提高亮度, 尝试达到目标对比度 - val lighterColor = findAdjustableHSLColor(hsl, background, minimumContrast, lighten = true) - if (lighterColor != null) { - return lighterColor + /* 先尝试变亮, 再尝试变暗, 找到即可返回. */ + listOf(true, false).forEach { lighten -> + findAdjustableHSLColor(hsl, background, minimumContrast, lighten)?.let { + return applyAlpha(it, alpha) + } } - // 降低亮度, 尝试达到目标对比度 - val darkerColor = findAdjustableHSLColor(hsl, background, minimumContrast, lighten = false) - if (darkerColor != null) { - return darkerColor - } + /* 极端情况下两次尝试都失败, 退回原色. */ + return applyAlpha(reference, alpha) + } - // 如果两种情况下都无法满足, 返回原始颜色 (极端情况) - return reference + @JvmStatic + @JvmOverloads + fun adjustThemeColorForContrast( + @ColorInt background: Int, + minimumContrast: Double = 4.5, + alpha: Double = 1.0, + ): Int = adjustColorForContrast( + background, + ThemeColorManager.colorPrimary, + minimumContrast, + alpha, + ) + + @JvmStatic + fun applyAlpha(@ColorInt color: Int, alpha: Double): Int = when (alpha) { + 1.0 -> color + else -> ColorUtils.setAlphaComponent(color, (alpha * 255).roundToInt()) } /** diff --git a/app/src/main/java/org/autojs/autojs/util/DeviceUtils.kt b/app/src/main/java/org/autojs/autojs/util/DeviceUtils.kt index 9a231110..25b5a23b 100644 --- a/app/src/main/java/org/autojs/autojs/util/DeviceUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/DeviceUtils.kt @@ -11,6 +11,7 @@ import android.os.BatteryManager import android.os.Build import android.telephony.TelephonyManager import androidx.annotation.IntRange +import org.autojs.autojs.runtime.api.ScreenMetrics import org.autojs.autojs.runtime.exception.ScriptException import org.autojs.autojs6.R import java.util.Arrays @@ -66,6 +67,7 @@ object DeviceUtils { ${context.getString(R.string.text_android_release_version)}: $releaseVersion ${context.getString(R.string.text_android_sdk_version)}: $sdkVersion ${context.getString(R.string.text_android_build_id)}: $buildID + ${context.getString(R.string.text_device_screen_resolution)}: ${ScreenMetrics.deviceScreenWidth} × ${ScreenMetrics.deviceScreenHeight} ${context.getString(R.string.text_device_brand)}: $brand ${context.getString(R.string.text_device_manufacturer)}: $manufacturer ${context.getString(R.string.text_device_name)}: $device diff --git a/app/src/main/java/org/autojs/autojs/util/ShortcutUtils.kt b/app/src/main/java/org/autojs/autojs/util/ShortcutUtils.kt index 32c4d66a..a7768d58 100644 --- a/app/src/main/java/org/autojs/autojs/util/ShortcutUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ShortcutUtils.kt @@ -79,6 +79,7 @@ object ShortcutUtils { .title(R.string.text_prompt) .content(R.string.text_pin_shortcut_not_unsupported) .positiveText(R.string.dialog_button_dismiss) + .positiveColorRes(R.color.dialog_button_failure) .build().also { it.show() } } diff --git a/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt b/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt index b1fcdeb2..a61c840f 100644 --- a/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/UpdateUtils.kt @@ -87,6 +87,7 @@ object UpdateUtils { showRemoveIgnoredVersionPrompt(context, dialog, dVersionInfo, text) } .positiveText(R.string.dialog_button_back) + .positiveColorRes(R.color.dialog_button_default) .onPositive { dVersionInfo, _ -> dVersionInfo.dismiss() } .autoDismiss(false) .show() diff --git a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt index dc77721e..51f94103 100644 --- a/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt +++ b/app/src/main/java/org/autojs/autojs/util/ViewUtils.kt @@ -27,6 +27,7 @@ import android.view.ViewTreeObserver import android.view.Window import android.view.WindowInsets import android.view.WindowManager +import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.FrameLayout import android.widget.ImageView @@ -660,6 +661,40 @@ object ViewUtils { } } + /** + * 显示软键盘. + * + * @param target 需要获取输入的视图 (如 EditText) + * @param useForced 是否使用 SHOW_FORCED 方式强制弹出, 默认 false, 代表由系统自行判断 + */ + @JvmStatic + @JvmOverloads + fun showSoftInput(target: View, useForced: Boolean = false) { + val imm = target.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager ?: return + if (!target.hasFocus()) { + target.requestFocus() + } + target.post { + @Suppress("DEPRECATION") + val flag = when (useForced) { + true -> InputMethodManager.SHOW_FORCED + else -> InputMethodManager.SHOW_IMPLICIT + } + imm.showSoftInput(target, flag) + } + } + + /** + * 隐藏软键盘. + * + * @param target 当前持有输入焦点的视图, 也可以是任意位于同一窗口的 View + */ + @JvmStatic + fun hideSoftInput(target: View) { + val imm = target.context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager ?: return + imm.hideSoftInputFromWindow(target.windowToken, 0) + } + class AutoNightMode { companion object { diff --git a/app/src/main/res/drawable/btn_radio_off_mtrl.xml b/app/src/main/res/drawable/btn_radio_off_mtrl.xml new file mode 100644 index 00000000..130167d1 --- /dev/null +++ b/app/src/main/res/drawable/btn_radio_off_mtrl.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/btn_radio_on_mtrl.xml b/app/src/main/res/drawable/btn_radio_on_mtrl.xml new file mode 100644 index 00000000..67c8790d --- /dev/null +++ b/app/src/main/res/drawable/btn_radio_on_mtrl.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_add_smaller_48dp.png b/app/src/main/res/drawable/ic_add_smaller_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..0d73ca08e63ac507203486e098f5a24323ea563c GIT binary patch literal 2415 zcmcgue`p(39KVjSxk*JC$|iFjHxWfI_wMC#$-OO`wW&?O>q;AKhg0|R?j<>z`?0%g zlUALzAovsgLzs->_J^YQM-U2vC~OXe3vF+Ep0dEXvpQ> zz59HBeZHUfUS90(>TF$o`)ZEkS~KZX54#@>uNzjd-<}^!E7@(8o8Ino+>L9(tA*P; zzLw)wykKVggMR&CL>w!E4JSt<70YF4j@!Jo;$kvD13pI!rkxbde0)IQO(QAv#dM&% z?X+m7M?Bg)(v>A614J`~ty}ob6~r7^G{AhtD%n1&B!!w^#Kz&YB=9vzFpw15!hn3g z-p#i=9_6(N5D5T)k82S*E)y8f-_Jt;p#&0=tcr310f>|+U;hX!oM+@wPwJt1F!q!b zib3EaNh+7ik#aQRcm+w;G))3ff>2}#(I2)0ToG-5W5Yv=`ouHcz;tXr^oVoLV2~78 zsxviMZqu#p*Lh-$Nfqo$as-4m)qn#!)jdA?ok{#Ue<9+ zjZSqpQs$u&0sK9ErfoQ7|K7_CXbJ~3DX^|ZMOhYQn1xZKXh=!i2Uz>S3{-avGe6vf z#zYW)vk)SfKr)yGWtuT?fUgKP2+BL2g;~L-g$q=2?SjBJX+-T#$?;fVmR+=#g|4HF z?FZN0KjDH4C4thW&zdz{UlF}@ zSAA46`I-t4CZW2M0twqn4WT}5&cndfRWReWT%^qDBJG}m`A$A4V~@5K7+Y7AleAFs zJ|0>;^_Y?{a6AUYIE)!$E~-#52Y@EZ3V~`gPZX@eM(MLthtVvM5d;XR4f$P5>UCO4 z5!(gI_DV_kAH`gi66f?`p|y1Vijl${az4I$E7u=9bo}43TMzR$z5l)S zrMCa%iRqT9^fF%O-d;7Tw7h;d_x17z_HyYpoVhfU|Dci4&dCo?Pv26#u;Kir$sM1q z-M8({-|+9_ov;1n*rVS~_D-LDWZ!d3kkZgg$xly|-~IE*xoYO|3p@7g8as3BhdZZ^ zZ7-j!K3#ohPvw^*Px6bVrGS{sU}p^@;!h literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml b/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml index 1db04984..d81c2b40 100644 --- a/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml +++ b/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml @@ -1,7 +1,7 @@ - + diff --git a/app/src/main/res/drawable/shortcut_create_dialog_icon_border.xml b/app/src/main/res/drawable/shortcut_create_dialog_icon_border.xml new file mode 100644 index 00000000..6dcd8958 --- /dev/null +++ b/app/src/main/res/drawable/shortcut_create_dialog_icon_border.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_build.xml b/app/src/main/res/layout/activity_build.xml index 7d1c27f4..418d8503 100644 --- a/app/src/main/res/layout/activity_build.xml +++ b/app/src/main/res/layout/activity_build.xml @@ -57,7 +57,7 @@ android:layout_marginTop="8dp" android:orientation="horizontal"> - - + - - + - - + - - + - - + - - + diff --git a/app/src/main/res/layout/activity_project_config.xml b/app/src/main/res/layout/activity_project_config.xml index 468787b6..af0fa61a 100644 --- a/app/src/main/res/layout/activity_project_config.xml +++ b/app/src/main/res/layout/activity_project_config.xml @@ -49,7 +49,7 @@ android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:textColor="?android:textColorSecondary" /> - - + - - + - - + - - + @@ -159,7 +159,7 @@ - - + @@ -194,7 +194,7 @@ android:textAppearance="@style/TextAppearance.AppCompat.Body2" android:textColor="?android:textColorSecondary" /> - - + - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_marginTop="6dp" + android:hint="@string/text_broadcast_action" + app:expandedHintEnabled="false"> - + diff --git a/app/src/main/res/layout/dialog_class_search.xml b/app/src/main/res/layout/dialog_class_search.xml index ab9a1b9d..f3eb7d03 100644 --- a/app/src/main/res/layout/dialog_class_search.xml +++ b/app/src/main/res/layout/dialog_class_search.xml @@ -1,19 +1,23 @@ - + - + android:layout_height="wrap_content" + app:expandedHintEnabled="false"> - + android:layout_height="wrap_content" /> + + + android:layout_height="400dp" /> + android:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_find_or_replace.xml b/app/src/main/res/layout/dialog_find_or_replace.xml index 540e9174..503c9142 100644 --- a/app/src/main/res/layout/dialog_find_or_replace.xml +++ b/app/src/main/res/layout/dialog_find_or_replace.xml @@ -1,59 +1,64 @@ - + - + android:hint="@string/text_find" + app:expandedHintEnabled="false"> - + android:layout_height="wrap_content" /> - + + + android:text="@string/text_regex" /> - + android:hint="@string/text_replace" + app:expandedHintEnabled="false"> - + android:layout_height="wrap_content" /> + + - + android:text="@string/text_replace" /> - + android:text="@string/text_replace_all" /> @@ -63,6 +68,6 @@ android:padding="4dp" android:text="@string/hint_find_with_regex" android:textColor="#929397" - android:textSize="12sp"/> + android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_new_key_store.xml b/app/src/main/res/layout/dialog_new_key_store.xml index 25585129..3d606e30 100644 --- a/app/src/main/res/layout/dialog_new_key_store.xml +++ b/app/src/main/res/layout/dialog_new_key_store.xml @@ -1,5 +1,6 @@ - - - + - - + android:hint="@string/text_file_name" + app:expandedHintEnabled="false"> - - + + + app:endIconMode="password_toggle" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_key_alias" + app:expandedHintEnabled="false"> - - + + + app:endIconMode="password_toggle" + app:expandedHintEnabled="false"> - + + + + - + android:hint="@string/text_validity_years" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_first_and_last_name" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_organization" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_organizational_unit" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_country_code" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_state_or_province" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_city_or_locality" + app:expandedHintEnabled="false"> - - + + + android:hint="@string/text_street" + app:expandedHintEnabled="false"> - + + + + + + android:text="@string/text_cancel" + android:textColor="@color/dialog_button_default" />