diff --git a/README.md b/README.md index f9f36b9..3567e72 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Added more features to app's crash dialog, fixed custom rom deleted dialog, the 此项目依然在开发中,现在未解决的问题和包含的问题如下 -- 排除列表和模块主界面功能正在开发 +- 排除列表以及更多功能正在开发 - 后台进程可能依然会弹出崩溃对话框且开发者选项里的设置无效,还在排查 diff --git a/app/build.gradle b/app/build.gradle index 288f5b2..fe4ca07 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ dependencies { compileOnly 'de.robv.android.xposed:api:82' implementation 'com.highcapable.yukihookapi:api:1.0.87' ksp 'com.highcapable.yukihookapi:ksp-xposed:1.0.87' + implementation "com.github.topjohnwu.libsu:core:3.1.2" implementation 'com.geyifeng.immersionbar:immersionbar:3.2.0' implementation 'com.geyifeng.immersionbar:immersionbar-ktx:3.2.0' implementation 'androidx.core:core-ktx:1.7.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4e724c2..f6e9a1f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -28,6 +28,32 @@ android:name="xposedscope" android:resource="@array/module_scope" /> + + + + + + + + + + + + + + + + + + + * + * This file is Created by fankes on 2022/5/14. + */ +package com.fankes.apperrorstracking.data + +import com.highcapable.yukihookapi.hook.xposed.prefs.data.PrefsData + +object DataConst { + + val ENABLE_HIDE_ICON = PrefsData("_hide_icon", false) +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt b/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt index 297525b..89c99a2 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/hook/entity/FrameworkHooker.kt @@ -119,6 +119,10 @@ object FrameworkHooker : YukiBaseHooker() { if (it.isNotBlank()) context?.sendBroadcast(Intent().apply { action = Const.ACTION_MODULE_HANDLER_RECEIVER when (it) { + Const.TYPE_MODULE_VERSION_VERIFY -> { + putExtra(Const.TAG_MODULE_VERSION_VERIFY, Const.MODULE_VERSION_VERIFY) + putExtra(Const.KEY_MODULE_HOST_FETCH, Const.TYPE_MODULE_VERSION_VERIFY) + } Const.TYPE_APP_ERRORS_DATA_GET -> { putExtra(Const.TAG_APP_ERRORS_DATA_GET_CONTENT, appErrorsRecords) putExtra(Const.KEY_MODULE_HOST_FETCH, Const.TYPE_APP_ERRORS_DATA_GET) diff --git a/app/src/main/java/com/fankes/apperrorstracking/locale/LocaleString.kt b/app/src/main/java/com/fankes/apperrorstracking/locale/LocaleString.kt index 7ad2b08..4b5fc79 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/locale/LocaleString.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/locale/LocaleString.kt @@ -250,4 +250,52 @@ object LocaleString { /** @string Automatic generated */ fun dontScreenshotTip(vararg objArrs: Any) = R.string.dont_screenshot_tip.bind(*objArrs) + + /** @string Automatic generated */ + val moduleVersion get() = moduleVersion() + + /** @string Automatic generated */ + fun moduleVersion(vararg objArrs: Any) = R.string.module_version.bind(*objArrs) + + /** @string Automatic generated */ + val systemVersion get() = systemVersion() + + /** @string Automatic generated */ + fun systemVersion(vararg objArrs: Any) = R.string.system_version.bind(*objArrs) + + /** @string Automatic generated */ + val areYouSureRestartSystem get() = areYouSureRestartSystem() + + /** @string Automatic generated */ + fun areYouSureRestartSystem(vararg objArrs: Any) = R.string.are_your_sure_restart_system.bind(*objArrs) + + /** @string Automatic generated */ + val fastRestart get() = fastRestart() + + /** @string Automatic generated */ + fun fastRestart(vararg objArrs: Any) = R.string.fast_restart.bind(*objArrs) + + /** @string Automatic generated */ + val accessRootFail get() = accessRootFail() + + /** @string Automatic generated */ + fun accessRootFail(vararg objArrs: Any) = R.string.access_root_fail.bind(*objArrs) + + /** @string Automatic generated */ + val moduleNotActivated get() = moduleNotActivated() + + /** @string Automatic generated */ + fun moduleNotActivated(vararg objArrs: Any) = R.string.module_not_activated.bind(*objArrs) + + /** @string Automatic generated */ + val moduleIsActivated get() = moduleIsActivated() + + /** @string Automatic generated */ + fun moduleIsActivated(vararg objArrs: Any) = R.string.module_is_activated.bind(*objArrs) + + /** @string Automatic generated */ + val moduleNotFullyActivated get() = moduleNotFullyActivated() + + /** @string Automatic generated */ + fun moduleNotFullyActivated(vararg objArrs: Any) = R.string.module_not_fully_activated.bind(*objArrs) } \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt new file mode 100644 index 0000000..ad84137 --- /dev/null +++ b/app/src/main/java/com/fankes/apperrorstracking/ui/activity/main/MainActivity.kt @@ -0,0 +1,102 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/14. + */ +@file:Suppress("SetTextI18n") + +package com.fankes.apperrorstracking.ui.activity.main + +import android.content.ComponentName +import android.content.pm.PackageManager +import android.os.Build +import androidx.core.view.isVisible +import com.fankes.apperrorstracking.R +import com.fankes.apperrorstracking.const.Const +import com.fankes.apperrorstracking.data.DataConst +import com.fankes.apperrorstracking.databinding.ActivityMainBinding +import com.fankes.apperrorstracking.locale.LocaleString +import com.fankes.apperrorstracking.ui.activity.base.BaseActivity +import com.fankes.apperrorstracking.utils.factory.openBrowser +import com.fankes.apperrorstracking.utils.tool.FrameworkTool +import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive +import com.highcapable.yukihookapi.hook.factory.modulePrefs +import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus + +class MainActivity : BaseActivity() { + + /** 模块是否有效 */ + private var isModuleValied = false + + override fun onCreate() { + binding.mainTextVersion.text = LocaleString.moduleVersion(Const.MODULE_VERSION_NAME) + binding.mainTextSystemVersion.text = + LocaleString.systemVersion("${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT}) ${Build.DISPLAY}") + binding.hideIconInLauncherSwitch.isChecked = modulePrefs.get(DataConst.ENABLE_HIDE_ICON) + binding.hideIconInLauncherSwitch.setOnCheckedChangeListener { btn, b -> + if (btn.isPressed.not()) return@setOnCheckedChangeListener + modulePrefs.put(DataConst.ENABLE_HIDE_ICON, b) + packageManager.setComponentEnabledSetting( + ComponentName(packageName, "${Const.MODULE_PACKAGE_NAME}.Home"), + if (b) PackageManager.COMPONENT_ENABLED_STATE_DISABLED else PackageManager.COMPONENT_ENABLED_STATE_ENABLED, + PackageManager.DONT_KILL_APP + ) + } + /** 重启按钮点击事件 */ + binding.titleRestartIcon.setOnClickListener { FrameworkTool.restartSystem(context = this) } + /** 项目地址按钮点击事件 */ + binding.titleGithubIcon.setOnClickListener { openBrowser(url = "https://github.com/KitsunePie/AppErrorsTracking") } + } + + /** 刷新模块状态 */ + private fun refreshModuleStatus() { + binding.mainLinStatus.setBackgroundResource( + when { + isXposedModuleActive && isModuleValied.not() -> R.drawable.bg_yellow_round + isXposedModuleActive -> R.drawable.bg_green_round + else -> R.drawable.bg_dark_round + } + ) + binding.mainImgStatus.setImageResource( + when { + isXposedModuleActive -> R.mipmap.ic_success + else -> R.mipmap.ic_warn + } + ) + binding.mainTextStatus.text = + when { + isXposedModuleActive && isModuleValied.not() -> LocaleString.moduleNotFullyActivated + isXposedModuleActive -> LocaleString.moduleIsActivated + else -> LocaleString.moduleNotActivated + } + binding.mainTextApiWay.isVisible = isXposedModuleActive + binding.mainTextApiWay.text = "Activated by ${YukiHookModuleStatus.executorName} API ${YukiHookModuleStatus.executorVersion}" + } + + override fun onResume() { + super.onResume() + /** 刷新模块状态 */ + refreshModuleStatus() + /** 发送广播检查模块激活状态 */ + FrameworkTool.checkingActivated(context = this) { isValied -> + isModuleValied = isValied + refreshModuleStatus() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/ui/view/MaterialSwitch.kt b/app/src/main/java/com/fankes/apperrorstracking/ui/view/MaterialSwitch.kt new file mode 100644 index 0000000..bd617ec --- /dev/null +++ b/app/src/main/java/com/fankes/apperrorstracking/ui/view/MaterialSwitch.kt @@ -0,0 +1,74 @@ +/* + * AppErrorsTracking - Added more features to app's crash dialog, fixed custom rom deleted dialog, the best experience to Android developer. + * Copyright (C) 2019-2022 Fankes Studio(qzmmcn@163.com) + * https://github.com/KitsunePie/AppErrorsTracking + * + * This software is non-free but opensource software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * and eula along with this software. If not, see + * + * + * This file is Created by fankes on 2022/5/14. + */ +@file:Suppress("SameParameterValue") + +package com.fankes.apperrorstracking.ui.view + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Color +import android.text.TextUtils +import android.util.AttributeSet +import androidx.appcompat.widget.SwitchCompat +import com.fankes.apperrorstracking.utils.drawable.drawabletoolbox.DrawableBuilder +import com.fankes.apperrorstracking.utils.factory.dp +import com.fankes.apperrorstracking.utils.factory.isSystemInDarkMode + +class MaterialSwitch(context: Context, attrs: AttributeSet?) : SwitchCompat(context, attrs) { + + private fun toColors(selected: Int, pressed: Int, normal: Int): ColorStateList { + val colors = intArrayOf(selected, pressed, normal) + val states = arrayOfNulls(3) + states[0] = intArrayOf(android.R.attr.state_checked) + states[1] = intArrayOf(android.R.attr.state_pressed) + states[2] = intArrayOf() + return ColorStateList(states, colors) + } + + private val thumbColor get() = if (context.isSystemInDarkMode) 0xFF7C7C7C else 0xFFCCCCCC + + init { + trackDrawable = DrawableBuilder() + .rectangle() + .rounded() + .solidColor(0xFF656565.toInt()) + .height(20.dp(context)) + .cornerRadius(15.dp(context)) + .build() + thumbDrawable = DrawableBuilder() + .rectangle() + .rounded() + .solidColor(Color.WHITE) + .size(20.dp(context), 20.dp(context)) + .cornerRadius(20.dp(context)) + .strokeWidth(8.dp(context)) + .strokeColor(Color.TRANSPARENT) + .build() + trackTintList = toColors( + 0xFF656565.toInt(), + thumbColor.toInt(), + thumbColor.toInt() + ) + isSingleLine = true + ellipsize = TextUtils.TruncateAt.END + } +} \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt b/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt index 4a46521..c5e4e63 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/utils/factory/FunctionFactory.kt @@ -28,16 +28,19 @@ import android.app.Service import android.content.* import android.content.pm.PackageManager import android.content.res.Configuration +import android.graphics.Color import android.graphics.drawable.Drawable import android.net.Uri import android.provider.Settings import android.widget.Toast import androidx.core.content.res.ResourcesCompat -import com.fankes.apperrorstracking.BuildConfig import com.fankes.apperrorstracking.R +import com.fankes.apperrorstracking.const.Const import com.fankes.apperrorstracking.locale.LocaleString +import com.google.android.material.snackbar.Snackbar import com.highcapable.yukihookapi.hook.factory.field import com.highcapable.yukihookapi.hook.type.android.ApplicationInfoClass +import com.topjohnwu.superuser.Shell /** * 系统深色模式是否开启 @@ -114,6 +117,19 @@ fun Context.appIcon(packageName: String) = */ fun Context.toast(msg: String) = Toast.makeText(this, msg, Toast.LENGTH_SHORT).show() +/** + * 弹出 [Snackbar] + * @param msg 提示内容 + * @param actionText 按钮文本 - 不写默认取消按钮 + * @param it 按钮事件回调 + */ +fun Context.snake(msg: String, actionText: String = "", it: () -> Unit = {}) = + Snackbar.make((this as Activity).findViewById(android.R.id.content), msg, Snackbar.LENGTH_LONG).apply { + if (actionText.isBlank()) return@apply + setActionTextColor(if (isSystemInDarkMode) Color.BLACK else Color.WHITE) + setAction(actionText) { it() } + }.show() + /** * 跳转到指定页面 * @@ -125,7 +141,7 @@ inline fun Context.navigate(isOutSide: Boolean = false, c startActivity((if (isOutSide) Intent() else Intent(if (this is Service) applicationContext else this, T::class.java)).apply { flags = if (this@navigate !is Activity) Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK else Intent.FLAG_ACTIVITY_NEW_TASK - if (isOutSide) component = ComponentName(BuildConfig.APPLICATION_ID, T::class.java.name) + if (isOutSide) component = ComponentName(Const.MODULE_PACKAGE_NAME, T::class.java.name) callback(this) }) }.onFailure { toast(msg = "Start ${T::class.java.name} failed") } @@ -155,6 +171,24 @@ fun Context.openSelfSetting(packageName: String = this.packageName) = runCatchin }) }.onFailure { toast(msg = "Cannot open '$packageName'") } +/** + * 启动系统浏览器 + * @param url 网址 + * @param packageName 指定包名 - 可不填 + */ +fun Context.openBrowser(url: String, packageName: String = "") = runCatching { + startActivity(Intent().apply { + if (packageName.isNotBlank()) setPackage(packageName) + action = Intent.ACTION_VIEW + data = Uri.parse(url) + /** 防止顶栈一样重叠在自己的 APP 中 */ + flags = Intent.FLAG_ACTIVITY_NEW_TASK + }) +}.onFailure { + if (packageName.isNotBlank()) snake(msg = "Cannot start '$packageName'") + else snake(msg = "Start system browser failed") +} + /** * 当前 APP 是否可被启动 * @param packageName 包名 @@ -170,4 +204,22 @@ fun Context.openApp(packageName: String = this.packageName) = runCatching { startActivity(packageManager.getLaunchIntentForPackage(packageName)?.apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK }) -}.onFailure { toast(msg = "Cannot start '$packageName'") } \ No newline at end of file +}.onFailure { toast(msg = "Cannot start '$packageName'") } + +/** + * 是否有 Root 权限 + * @return [Boolean] + */ +val isRootAccess get() = runCatching { Shell.rootAccess() }.getOrNull() ?: false + +/** + * 执行命令 + * @param cmd 命令 + * @param isSu 是否使用 Root 权限执行 - 默认:是 + * @return [String] 执行结果 + */ +fun execShell(cmd: String, isSu: Boolean = true) = runCatching { + (if (isSu) Shell.su(cmd) else Shell.sh(cmd)).exec().out.let { + if (it.isNotEmpty()) it[0].trim() else "" + } +}.getOrNull() ?: "" \ No newline at end of file diff --git a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt b/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt index 65a9c25..0888e7e 100644 --- a/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt +++ b/app/src/main/java/com/fankes/apperrorstracking/utils/tool/FrameworkTool.kt @@ -29,6 +29,11 @@ import android.content.Intent import android.content.IntentFilter import com.fankes.apperrorstracking.bean.AppErrorsInfoBean import com.fankes.apperrorstracking.const.Const +import com.fankes.apperrorstracking.locale.LocaleString +import com.fankes.apperrorstracking.utils.factory.execShell +import com.fankes.apperrorstracking.utils.factory.isRootAccess +import com.fankes.apperrorstracking.utils.factory.showDialog +import com.fankes.apperrorstracking.utils.factory.snake import com.highcapable.yukihookapi.hook.log.loggerE import java.io.Serializable @@ -37,6 +42,9 @@ import java.io.Serializable */ object FrameworkTool { + /** 回调模块激活状态 */ + private var onModuleActiveStatusCallback: ((Boolean) -> Unit)? = null + /** 回调获取的 APP 异常信息 */ private var onAppErrorsInfoDataCallback: ((ArrayList) -> Unit)? = null @@ -54,6 +62,8 @@ object FrameworkTool { runCatching { intent.getStringExtra(Const.KEY_MODULE_HOST_FETCH)?.also { if (it.isNotBlank()) when (it) { + Const.TYPE_MODULE_VERSION_VERIFY -> + onModuleActiveStatusCallback?.invoke(intent.getStringExtra(Const.TAG_MODULE_VERSION_VERIFY) == Const.MODULE_VERSION_VERIFY) Const.TYPE_APP_ERRORS_DATA_GET -> runCatching { onAppErrorsInfoDataCallback?.invoke( intent.getSerializableExtra(Const.TAG_APP_ERRORS_DATA_GET_CONTENT) as ArrayList @@ -69,6 +79,27 @@ object FrameworkTool { } } + /** + * 重启系统 + * @param context 实例 + */ + fun restartSystem(context: Context) = + context.showDialog { + title = LocaleString.notice + msg = LocaleString.areYouSureRestartSystem + confirmButton { + if (isRootAccess) + execShell(cmd = "reboot") + else context.snake(LocaleString.accessRootFail) + } + neutralButton(LocaleString.fastRestart) { + if (isRootAccess) + execShell(cmd = "killall zygote") + else context.snake(LocaleString.accessRootFail) + } + cancelButton() + } + /** * 发送广播 * @param context 实例 @@ -92,6 +123,16 @@ object FrameworkTool { }) } + /** + * 检查模块是否激活 + * @param context 实例 + * @param it 成功后回调 - ([Boolean] 是否激活) + */ + fun checkingActivated(context: Context, it: (Boolean) -> Unit) { + onModuleActiveStatusCallback = it + pushReceiver(context, Const.TYPE_MODULE_VERSION_VERIFY) + } + /** * 获取 APP 异常信息数组 * @param context 实例 diff --git a/app/src/main/res/drawable-night/bg_dark_round.xml b/app/src/main/res/drawable-night/bg_dark_round.xml new file mode 100755 index 0000000..71baadb --- /dev/null +++ b/app/src/main/res/drawable-night/bg_dark_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_dark_round.xml b/app/src/main/res/drawable/bg_dark_round.xml new file mode 100755 index 0000000..ccc45c0 --- /dev/null +++ b/app/src/main/res/drawable/bg_dark_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_green_round.xml b/app/src/main/res/drawable/bg_green_round.xml new file mode 100755 index 0000000..5ac75d3 --- /dev/null +++ b/app/src/main/res/drawable/bg_green_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_orange_round.xml b/app/src/main/res/drawable/bg_orange_round.xml new file mode 100755 index 0000000..043d002 --- /dev/null +++ b/app/src/main/res/drawable/bg_orange_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_yellow_round.xml b/app/src/main/res/drawable/bg_yellow_round.xml new file mode 100755 index 0000000..215bdc4 --- /dev/null +++ b/app/src/main/res/drawable/bg_yellow_round.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..fef047f --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,308 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxhdpi/ic_about.png b/app/src/main/res/mipmap-xxhdpi/ic_about.png new file mode 100644 index 0000000..12a0dda Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_about.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_github.png b/app/src/main/res/mipmap-xxhdpi/ic_github.png new file mode 100644 index 0000000..302740a Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_github.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_home.png b/app/src/main/res/mipmap-xxhdpi/ic_home.png new file mode 100644 index 0000000..4e51dfa Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_restart.png b/app/src/main/res/mipmap-xxhdpi/ic_restart.png new file mode 100644 index 0000000..c98cd02 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_restart.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_success.png b/app/src/main/res/mipmap-xxhdpi/ic_success.png new file mode 100644 index 0000000..a3ced9b Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_success.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_warn.png b/app/src/main/res/mipmap-xxhdpi/ic_warn.png new file mode 100644 index 0000000..5e87f03 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_warn.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_yukihookapi.png b/app/src/main/res/mipmap-xxhdpi/ic_yukihookapi.png new file mode 100644 index 0000000..f16902d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_yukihookapi.png differ diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index bfdf33e..05c5d7a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -36,9 +36,9 @@ キャンセル モア ヒント - すべてのエラーレコードをクリアしてもよろしいですか? + すべてのエラーレコードをクリアしてもよろしいですか すべてのアラーレコードがクリアされました - すべてのログファイルをエクスポートしてもよろしいですか? 梱包プロセスには時間がかかる場合があります。 + すべてのログファイルをエクスポートしてもよろしいですか。梱包プロセスには時間がかかる場合があります。 詳細を見る すべてのエラーレコードがエクスポートされました すべてのエラーレコードのエクスポートに失敗しました @@ -48,4 +48,21 @@ 分かります スクリーンショットを撮らないでください エラーログのスクリーンショットを撮ることはお勧めできません。このインターフェイスの右上隅にあるボタンをクリックして、ログの内容を抽出またはコピーする必要があります。 + リスタートシステム + プロジェクトアドレス + モジュールが無効化でした + モジュールバージョン: %1$s + システムバージョン: %1$s + モジュールが有効化でした + 一部の設定を変更した後、リスタートシステムして有効にするには、右上隅をクリックする必要がある場合があります。 + 表示設定 + デスクトップ上のアプリアイコンを非表示 + モジュールアイコンを非表示にすると、インターフェイスが閉じてデスクトップに表示されなくなります。モジュール設定は、EdXposedまたはLSPosedで検索して開くことができます。 + 注:LSPosedの「Force apps to show launcher icons」機能を必ずオフにしてください + このモジュールは、YukiHookAPIを使用して構築できます。 \n詳細 https://github.com/fankes/YukiHookAPI + モジュールが不完全に有効化でした + リスタートシステムしてもよろしいですか + 高速リスタート + ルート権限を取得できませんでした + より多くの機能が開発中です \ No newline at end of file diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 4226fb1..53df9f5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -48,4 +48,21 @@ 我知道了 请不要截屏 在错误日志中截屏是不明智的做法,你应当点击此界面右上角的按钮提取或复制日志内容。 + 重启系统 + 项目地址 + 模块未激活 + 模块版本:%1$s + 系统版本:%1$s + 模块已激活 + 部分设置修改后可能需要点击右上角重启系统才能生效。 + 显示设置 + 在桌面隐藏模块图标 + 隐藏模块图标后界面可能会被关闭,将不会再在桌面显示,你可以在 EdXposed、LSPosed 中找到模块设置并打开。 + 注意:请务必在 LSPosed 中关闭“强制显示桌面图标”功能 + 此模块使用 YukiHookAPI 构建。\n了解更多 https://github.com/fankes/YukiHookAPI + 模块未完全激活,请重启系统 + 你确定要重启系统吗? + 快速重启 + 获取 Root 权限失败 + 更多功能正在开发 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 8ffeae3..1ef0384 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -48,4 +48,21 @@ 我懂了 請不要捕獲熒屏 在錯誤日誌中捕獲熒屏是不明理的做法,你應當點擊此界面右上角的按鈕提取或複制日誌內容。 + 重新開機 + 項目地址 + 模組未激活 + 模組版本:%1$s + 系統版本:%1$s + 模組已激活 + 部分設置修改後可能需要點擊右上角重啟系統才能生效。 + 顯示設置 + 在桌面隱藏模組圖標 + 隱藏模組圖標後界面可能會被關閉,將不會再在桌面顯示,你可以在 EdXposed、LSPosed 中找到模組設置並打開。 + 注意:請務必在 LSPosed 中關閉“強制顯示桌面圖標”功能 + 此模組使用 YukiHookAPI 構建。 \n了解更多 https://github.com/fankes/YukiHookAPI + 模組未完全激活,請重新開機 + 你確定要重新開機嗎? + 急速重開 + 取得 Root 权利失败 + 更多機能正在開發 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rMO/strings.xml b/app/src/main/res/values-zh-rMO/strings.xml index 2609e07..f562aac 100644 --- a/app/src/main/res/values-zh-rMO/strings.xml +++ b/app/src/main/res/values-zh-rMO/strings.xml @@ -48,4 +48,21 @@ 我懂了 請不要捕獲熒屏 在錯誤日誌中捕獲熒屏是不明理的做法,你應當點擊此界面右上角的按鈕提取或複制日誌內容。 + 重新開機 + 項目地址 + 模組未激活 + 模組版本:%1$s + 系統版本:%1$s + 模組已激活 + 部分設置修改後可能需要點擊右上角重啟系統才能生效。 + 顯示設置 + 在桌面隱藏模組圖標 + 隱藏模組圖標後界面可能會被關閉,將不會再在桌面顯示,你可以在 EdXposed、LSPosed 中找到模組設置並打開。 + 注意:請務必在 LSPosed 中關閉“強制顯示桌面圖標”功能 + 此模組使用 YukiHookAPI 構建。 \n了解更多 https://github.com/fankes/YukiHookAPI + 模組未完全激活,請重新開機 + 你確定要重新開機嗎? + 急速重開 + 取得 Root 权利失败 + 更多機能正在開發 \ No newline at end of file diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 576a9f4..d9fbc2f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -48,4 +48,21 @@ 我懂了 請不要捕獲熒屏 在錯誤日誌中捕獲熒屏是不明理的做法,你應當點擊此界面右上角的按鈕提取或複制日誌內容。 + 重新開機 + 項目地址 + 模組未激活 + 模組版本:%1$s + 系統版本:%1$s + 模組已激活 + 部分設置修改後可能需要點擊右上角重啟系統才能生效。 + 顯示設置 + 在桌面隱藏模組圖標 + 隱藏模組圖標後界面可能會被關閉,將不會再在桌面顯示,你可以在 EdXposed、LSPosed 中找到模組設置並打開。 + 注意:請務必在 LSPosed 中關閉“強制顯示桌面圖標”功能 + 此模組使用 YukiHookAPI 構建。 \n了解更多 https://github.com/fankes/YukiHookAPI + 模組未完全激活,請重新開機 + 你確定要重新開機嗎? + 急速重開 + 取得 Root 权利失败 + 更多機能正在開發 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5b418ba..8680cca 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -47,4 +47,21 @@ Got it Do not take screenshots It is not advisable to take a screenshot of the error log, you should extract or copy the log content by clicking the button in the upper right corner of this interface. + Restart system + Project address + Module not activated + Module version: %1$s + System version: %1$s + Module is activated + After some settings are modified, you may need to click the upper right corner to restart the system to take effect. + Display settings + Hide app icons on desktop + After hiding the app icon, the interface may be closed and will no longer be displayed on the desktop. You can find and open the module settings in EdXposed or LSPosed. + Note: Be sure to turn off the \"Force apps to show launcher icons\" feature in LSPosed + This module is made by YukiHookAPI. \nLearn more https://github.com/fankes/YukiHookAPI + Module not fully activated + Are you sure you want to restart system? + Fast restart + Access Root failed + More features are in development \ No newline at end of file