6.6.2 - Alpha6 - 打包应用设置页面增加访问所有文件和发送通知等特殊权限开关 (#354)

This commit is contained in:
SuperMonster003
2025-04-13 14:11:06 +08:00
parent 99b8f34137
commit bd02228600
48 changed files with 372 additions and 123 deletions

View File

@@ -649,11 +649,11 @@
<activity
android:name="org.autojs.autojs.inrt.LogActivity"
android:theme="@style/AppTheme.LogActivityInrt" />
android:theme="@style/AppTheme.NoActionBarInrt" />
<activity
android:name="org.autojs.autojs.inrt.SettingsActivity"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
android:theme="@style/AppTheme.NoActionBarInrt" />
<!-- This provider is required by Shizuku, remove this if your app only supports Sui -->
<provider

View File

@@ -6,7 +6,7 @@
# v6.6.2
###### 2025/04/12
###### 2025/04/13
* `新增` ui.statusBarAppearanceLight/statusBarAppearanceLightBy/navigationBarColor 等方法
* `新增` images.flip 方法, 用于图像翻转 _[`issue #349`](http://issues.autojs6.com/349)_
@@ -31,6 +31,7 @@
* `优化` 精简打包应用模板 APK 文件大小
* `优化` 打包页面支持 Pinyin 库选项
* `优化` 打包应用主活动页面优化状态栏背景及文字颜色
* `优化` 打包应用设置页面增加访问所有文件和发送通知等特殊权限开关 _[`issue #354`](http://issues.autojs6.com/354)_
* `优化` 控件的文字及图标根据主题色亮度值自动切换合适的颜色
* `优化` 部分控件主题色与背景色对比度过低时的视觉体验
* `优化` 应用内页面导航栏设置为透明或半透明以增强视觉体验

View File

@@ -6,7 +6,7 @@
# v6.6.2
###### 2025/04/12
###### 2025/04/13
* `新增` ui.statusBarAppearanceLight/statusBarAppearanceLightBy/navigationBarColor 等方法
* `新增` images.flip 方法, 用于图像翻转 _[`issue #349`](http://issues.autojs6.com/349)_
@@ -31,6 +31,7 @@
* `优化` 精简打包应用模板 APK 文件大小
* `优化` 打包页面支持 Pinyin 库选项
* `优化` 打包应用主活动页面优化状态栏背景及文字颜色
* `优化` 打包应用设置页面增加访问所有文件和发送通知等特殊权限开关 _[`issue #354`](http://issues.autojs6.com/354)_
* `优化` 控件的文字及图标根据主题色亮度值自动切换合适的颜色
* `优化` 部分控件主题色与背景色对比度过低时的视觉体验
* `优化` 应用内页面导航栏设置为透明或半透明以增强视觉体验

View File

@@ -3,7 +3,6 @@ package org.autojs.autojs
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.SharedPreferences
import android.os.Bundle
import android.view.WindowManager
import com.benjaminwan.ocrlibrary.OcrEngine
@@ -59,7 +58,7 @@ abstract class AbstractAutoJs protected constructor(val application: Application
val scriptEngineManager = ScriptEngineManager(applicationContext)
scriptEngineManager.registerEngine(JavaScriptSource.ENGINE) {
val rt = createRuntime()
when (BuildConfig.isInrt) {
when (isInrt) {
true -> LoopBasedJavaScriptEngineWithDecryption(rt, applicationContext)
else -> LoopBasedJavaScriptEngine(rt, applicationContext)
}.also { it.runtime = rt }
@@ -110,11 +109,11 @@ abstract class AbstractAutoJs protected constructor(val application: Application
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
ScreenMetrics.init(activity)
appUtils.setCurrentActivity(activity)
registerOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
registerOnSharedPreferenceChangeListener { _, key ->
if (key == StringUtils.key(R.string.key_keep_screen_on_when_in_foreground)) {
configKeepScreenOnWhenInForeground(activity)
}
})
}
}
override fun onActivityPaused(activity: Activity) = appUtils.setCurrentActivity(null)
@@ -138,4 +137,12 @@ abstract class AbstractAutoJs protected constructor(val application: Application
open fun createGlobalConsole() = GlobalConsole(uiHandler)
companion object {
@JvmStatic
@Suppress("KotlinConstantConditions")
val isInrt get() = BuildConfig.isInrt
}
}

View File

@@ -23,7 +23,6 @@ import org.autojs.autojs.ui.floating.FullScreenFloatyWindow
import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow
import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow
import org.autojs.autojs.util.RhinoUtils.isBackgroundThread
import org.autojs.autojs6.BuildConfig
import java.util.concurrent.Executors
import org.autojs.autojs.inrt.autojs.AutoJs as AutoJsInrt
@@ -146,7 +145,7 @@ open class AutoJs(appContext: Application) : AbstractAutoJs(appContext) {
fun initInstance(application: Application) {
Log.d(TAG, "AutoJs isInitialized: $isInitialized")
if (!isInitialized) {
instance = when (BuildConfig.isInrt) {
instance = when (isInrt) {
true -> AutoJsInrt(application)
else -> AutoJs(application)
}

View File

@@ -10,6 +10,7 @@ import android.util.Log
import com.mcal.apksigner.ApkSigner
import com.reandroid.arsc.chunk.TableBlock
import org.apache.commons.io.FileUtils
import org.autojs.autojs.AbstractAutoJs.Companion.isInrt
import org.autojs.autojs.apkbuilder.keystore.AESUtils
import org.autojs.autojs.app.GlobalAppContext
import org.autojs.autojs.engine.encryption.AdvancedEncryptionStandard
@@ -22,7 +23,6 @@ import org.autojs.autojs.script.EncryptedScriptFileHeader.writeHeader
import org.autojs.autojs.script.JavaScriptFileSource
import org.autojs.autojs.util.FileUtils.TYPE.JAVASCRIPT
import org.autojs.autojs.util.MD5Utils
import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
import pxb.android.StringItem
import pxb.android.axml.AxmlWriter
@@ -552,7 +552,7 @@ open class ApkBuilder(apkInputStream: InputStream?, private val outApkFile: File
);
fun ensureLibFiles(moduleName: String = label) {
if (!BuildConfig.isInrt) return
if (!isInrt) return
val nativeLibraryDir = File(globalContext.applicationInfo.nativeLibraryDir)
val primaryNativeLibraries = nativeLibraryDir.list()?.toList() ?: emptyList()
if (!primaryNativeLibraries.containsAll(libsToInclude)) {

View File

@@ -5,11 +5,11 @@ import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import org.autojs.autojs.AbstractAutoJs;
import org.autojs.autojs.core.looper.LooperHelper;
import org.autojs.autojs.runtime.ScriptRuntime;
import org.autojs.autojs.script.JavaScriptSource;
import org.autojs.autojs.script.ScriptSource;
import org.autojs.autojs6.BuildConfig;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.mozilla.javascript.ContinuationPending;
@@ -74,7 +74,7 @@ public class LoopBasedJavaScriptEngine extends RhinoJavaScriptEngine {
continue;
} catch (Throwable t) {
mLooping = false;
if (BuildConfig.isInrt && t.getMessage() != null) {
if (AbstractAutoJs.isInrt() && t.getMessage() != null) {
ScriptRuntime.popException(t.getMessage());
}
throw t;

View File

@@ -1,5 +1,6 @@
package org.autojs.autojs.execution;
import org.autojs.autojs.AbstractAutoJs;
import org.autojs.autojs.core.looper.Loopers;
import org.autojs.autojs.engine.LoopBasedJavaScriptEngine;
import org.autojs.autojs.engine.ScriptEngine;
@@ -7,7 +8,6 @@ import org.autojs.autojs.engine.ScriptEngineManager;
import org.autojs.autojs.inrt.autojs.LoopBasedJavaScriptEngineWithDecryption;
import org.autojs.autojs.script.JavaScriptSource;
import org.autojs.autojs.script.ScriptSource;
import org.autojs.autojs6.BuildConfig;
/**
* Created by Stardust on Oct 27, 2017.
@@ -25,7 +25,7 @@ public class LoopedBasedJavaScriptExecution extends RunnableScriptExecution {
sleep(delay);
long interval = getConfig().getInterval();
var javaScriptEngine = BuildConfig.isInrt
var javaScriptEngine = AbstractAutoJs.isInrt()
? (LoopBasedJavaScriptEngineWithDecryption) engine
: (LoopBasedJavaScriptEngine) engine;
javaScriptEngine.getRuntime().loopers.setMainLooperQuitHandler(new Loopers.LooperQuitHandler() {

View File

@@ -14,6 +14,7 @@ import android.view.MenuItem
import android.view.MotionEvent
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import org.autojs.autojs.AbstractAutoJs.Companion.isInrt
import org.autojs.autojs.annotation.ScriptInterface
import org.autojs.autojs.core.eventloop.EventEmitter
import org.autojs.autojs.core.eventloop.SimpleEvent
@@ -28,7 +29,6 @@ import org.autojs.autojs.inrt.autojs.LoopBasedJavaScriptEngineWithDecryption
import org.autojs.autojs.runtime.ScriptRuntime
import org.autojs.autojs.script.ScriptSource
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
import org.mozilla.javascript.ContinuationPending
@@ -138,7 +138,7 @@ class ScriptExecuteActivity : AppCompatActivity() {
mScriptEngine.setTag(ScriptEngine.TAG_SOURCE, mScriptSource)
mExecutionListener!!.onStart(mScriptExecution)
if (BuildConfig.isInrt) {
if (isInrt) {
(mScriptEngine as LoopBasedJavaScriptEngineWithDecryption).execute(mScriptSource, executeCallback)
} else {
(mScriptEngine as LoopBasedJavaScriptEngine).execute(mScriptSource, executeCallback)

View File

@@ -2,6 +2,7 @@ package org.autojs.autojs.inrt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import org.autojs.autojs.theme.preference.ThemeColorPermissionSwitchPreference
import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivitySettingsInrtBinding
@@ -11,12 +12,14 @@ import org.autojs.autojs6.databinding.ActivitySettingsInrtBinding
*/
class SettingsActivity : AppCompatActivity() {
private val preferenceFragment by lazy { PreferenceFragment() }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivitySettingsInrtBinding.inflate(layoutInflater).also { setContentView(it.root) }
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_setting, PreferenceFragment())
.replace(R.id.fragment_setting, preferenceFragment)
.commit()
binding.toolbar.apply {
setTitle(R.string.text_settings)
@@ -26,6 +29,17 @@ class SettingsActivity : AppCompatActivity() {
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
override fun onResume() {
super.onResume()
findPreference(R.string.key_all_files_access)?.sync()
findPreference(R.string.key_display_over_other_apps)?.sync()
findPreference(R.string.key_post_notifications_permission)?.sync()
}
private fun findPreference(keyRes: Int): ThemeColorPermissionSwitchPreference? {
return preferenceFragment.findPreference(getString(keyRes))
}
class PreferenceFragment : androidx.preference.PreferenceFragmentCompat() {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preference_inrt)

View File

@@ -1,22 +1,24 @@
package org.autojs.autojs.inrt
import android.Manifest
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.PackageManager.PERMISSION_DENIED
import android.graphics.Typeface
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.autojs.autojs.inrt.autojs.AutoJs
import org.autojs.autojs.inrt.launch.GlobalProjectLauncher
import org.autojs.autojs.project.ProjectConfig
import org.autojs.autojs.ui.splash.SplashActivity.Companion.INIT_TIMEOUT
import org.autojs.autojs6.databinding.ActivitySplashInrtBinding
import kotlin.concurrent.thread
/**
* Created by Stardust on Feb 2, 2018.
@@ -28,42 +30,40 @@ class SplashActivity : AppCompatActivity() {
val binding = ActivitySplashInrtBinding.inflate(layoutInflater).apply {
setContentView(root)
}
val handler = Handler(Looper.myLooper()!!)
val projectConfig = ProjectConfig.fromAssets(this, ProjectConfig.configFileOfDir("project"))
var timeout = INIT_TIMEOUT
if (!projectConfig.launchConfig.isSplashVisible) {
timeout = 0L
} else {
handler.post {
binding.slug.typeface = Typeface.createFromAsset(assets, "roboto_medium.ttf")
binding.slug.isVisible = true
binding.icon.isVisible = true
when {
!projectConfig.launchConfig.isSplashVisible -> {
timeout = 0L
}
else -> {
CoroutineScope(Dispatchers.Main).launch {
binding.slug.typeface = Typeface.createFromAsset(assets, "roboto_medium.ttf")
binding.slug.isVisible = true
binding.icon.isVisible = true
}
}
}
if (!Pref.isFirstUsing) {
main()
} else {
handler.postDelayed({ this@SplashActivity.main() }, timeout)
CoroutineScope(Dispatchers.Main).launch {
if (timeout > 0 && Pref.isFirstUsing) {
delay(timeout)
}
checkPermission(WRITE_EXTERNAL_STORAGE)
}
super.onCreate(savedInstanceState)
}
private fun main() {
checkPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
private fun runScript() {
thread(true) {
CoroutineScope(Dispatchers.IO).launch {
val context = this@SplashActivity
try {
GlobalProjectLauncher.launch(this)
GlobalProjectLauncher.launch(context)
} catch (e: Exception) {
e.printStackTrace()
runOnUiThread {
Toast.makeText(this@SplashActivity, e.message, Toast.LENGTH_LONG).show()
startActivity(Intent(this@SplashActivity, LogActivity::class.java))
withContext(Dispatchers.Main) {
Toast.makeText(context, e.message, Toast.LENGTH_LONG).show()
startActivity(Intent(context, LogActivity::class.java))
AutoJs.instance.globalConsole.printAllStackTrace(e)
}
}
@@ -84,11 +84,10 @@ class SplashActivity : AppCompatActivity() {
}
}
private fun getRequestPermissions(permissions: Array<out String>) = ArrayList<String>()
.let { list ->
permissions.filterTo(list) { checkSelfPermission(it) == PERMISSION_DENIED }
list.toTypedArray()
}
private fun getRequestPermissions(permissions: Array<out String>) = ArrayList<String>().let { list ->
permissions.filterTo(list) { checkSelfPermission(it) == PERMISSION_DENIED }
list.toTypedArray()
}
companion object {

View File

@@ -0,0 +1,26 @@
package org.autojs.autojs.inrt.theme.preference
import android.content.Context
import android.util.AttributeSet
import org.autojs.autojs.permission.DisplayOverOtherAppsPermission
import org.autojs.autojs.theme.preference.ThemeColorPermissionSwitchPreference
class DisplayOverOtherAppsPermissionSwitchPreference : ThemeColorPermissionSwitchPreference {
val perm by lazy { DisplayOverOtherAppsPermission(context) }
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context) : super(context)
override fun has() = perm.has()
override fun request() = perm.request()
override fun revoke() = perm.revoke()
}

View File

@@ -0,0 +1,26 @@
package org.autojs.autojs.inrt.theme.preference
import android.content.Context
import android.util.AttributeSet
import org.autojs.autojs.permission.ManageAllFilesPermission
import org.autojs.autojs.theme.preference.ThemeColorPermissionSwitchPreference
class ManageAllFilesPermissionSwitchPreference : ThemeColorPermissionSwitchPreference {
val perm by lazy { ManageAllFilesPermission(context) }
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context) : super(context)
override fun has() = perm.has()
override fun request() = perm.request()
override fun revoke() = perm.revoke()
}

View File

@@ -0,0 +1,26 @@
package org.autojs.autojs.inrt.theme.preference
import android.content.Context
import android.util.AttributeSet
import org.autojs.autojs.permission.PostNotificationsPermission
import org.autojs.autojs.theme.preference.ThemeColorPermissionSwitchPreference
class PostNotificationsPermissionSwitchPreference : ThemeColorPermissionSwitchPreference {
val perm by lazy { PostNotificationsPermission(context) }
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context) : super(context)
override fun has() = perm.has()
override fun request() = perm.request()
override fun revoke() = perm.revoke()
}

View File

@@ -2,8 +2,9 @@ package org.autojs.autojs.permission
import android.content.Context
import android.os.Build
import androidx.fragment.app.FragmentActivity
import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.ui.main.MainActivity
import org.autojs.autojs.runtime.api.Permissions
import org.autojs.autojs.ui.main.drawer.PermissionItemHelper
import org.autojs.autojs.util.NotificationUtils
import org.autojs.autojs6.R
@@ -11,7 +12,7 @@ import org.autojs.autojs6.R
/**
* Created by SuperMonster003 on May 4, 2023.
*/
class PostNotificationPermission(override val context: Context) : PermissionItemHelper, AbleToUrge {
class PostNotificationsPermission(override val context: Context) : PermissionItemHelper, AbleToUrge {
override fun has() = NotificationUtils.isEnabled()
@@ -23,9 +24,11 @@ class PostNotificationPermission(override val context: Context) : PermissionItem
override fun urge() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
(context as? MainActivity)
?.requestMultiplePermissionsLauncher
?.let { NotificationUtils.requestPermission(it) }
when (val ctx = context) {
is FragmentActivity -> Permissions.getRequestMultiplePermissionsLauncher(ctx).let {
NotificationUtils.requestPermission(it)
}
}
}
}

View File

@@ -1,8 +1,15 @@
package org.autojs.autojs.runtime.api
import android.Manifest
import android.content.Context
import android.content.Intent
import android.util.Log
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
import androidx.fragment.app.FragmentActivity
import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.util.RomUtils
import org.autojs.autojs6.R
class Permissions(private val context: Context) {
@@ -46,4 +53,20 @@ class Permissions(private val context: Context) {
/* permissions.writeSecuritySettings */
/* permissions.projectMediaAccess */
companion object {
private val TAG = Permissions::class.java.simpleName
@JvmStatic
fun getRequestMultiplePermissionsLauncher(activity: FragmentActivity): ActivityResultLauncher<Array<String>> = activity.registerForActivityResult(RequestMultiplePermissions()) {
it.forEach { (key: String, isGranted: Boolean) ->
Log.d(TAG, "$key: $isGranted")
if (key == Manifest.permission.POST_NOTIFICATIONS) {
Pref.putBoolean(R.string.key_post_notification_permission_requested, true)
}
}
}
}
}

View File

@@ -7,6 +7,7 @@ import android.content.ServiceConnection
import android.content.pm.PackageManager
import android.os.IBinder
import android.util.Log
import org.autojs.autojs.AbstractAutoJs.Companion.isInrt
import org.autojs.autojs.App
import org.autojs.autojs.annotation.ScriptInterface
import org.autojs.autojs.app.GlobalAppContext
@@ -14,7 +15,6 @@ import org.autojs.autojs.core.shizuku.IUserService
import org.autojs.autojs.core.shizuku.UserService
import org.autojs.autojs.util.App.SHIZUKU
import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs6.BuildConfig
import org.autojs.autojs6.R
import rikka.shizuku.Shizuku
import java.util.concurrent.CountDownLatch
@@ -32,7 +32,7 @@ object WrappedShizuku {
private val TAG: String = WrappedShizuku::class.java.simpleName
private val mRequestCode = when {
BuildConfig.isInrt -> "shizuku-request-code-inrt".hashCode()
isInrt -> "shizuku-request-code-inrt".hashCode()
else -> "shizuku-request-code".hashCode()
}
private var mHasBinder = false

View File

@@ -4,6 +4,7 @@ import android.app.Activity
import android.content.Context
import android.graphics.Paint
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
@@ -16,7 +17,10 @@ import java.util.*
object ThemeColorManager {
@JvmField
var defaultThemeColor = ThemeColor(ColorUtils.fromResources(R.color.theme_color_default))
var defaultThemeColor = when {
isInrt -> R.color.md_blue_gray_900
else -> R.color.theme_color_default
}.let { ThemeColor(ColorUtils.fromResources(it)) }
@JvmStatic
lateinit var currentThemeColor: ThemeColor

View File

@@ -0,0 +1,32 @@
package org.autojs.autojs.theme.preference
import android.content.Context
import android.util.AttributeSet
abstract class ThemeColorPermissionSwitchPreference : ThemeColorSwitchPreference {
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context) : super(context)
fun sync() {
isChecked = has()
}
abstract fun has(): Boolean
abstract fun request(): Boolean
abstract fun revoke(): Boolean
override fun onClick() = toggle()
private fun toggle() {
if (isChecked) revoke() else request()
}
}

View File

@@ -20,7 +20,7 @@ import org.autojs.autojs6.R
/**
* Created by Stardust on Mar 5, 2017.
*/
class ThemeColorSwitchPreference : SwitchPreference, ThemeColorMutable, LongClickablePreferenceLike {
open class ThemeColorSwitchPreference : SwitchPreference, ThemeColorMutable, LongClickablePreferenceLike {
private var mCheckableView: View? = null
private var mColor = Color.TRANSPARENT
@@ -81,10 +81,10 @@ class ThemeColorSwitchPreference : SwitchPreference, ThemeColorMutable, LongClic
}
}
private fun obtainStyledAttrs(context: Context, set: AttributeSet?, styleableRes: IntArray, defStyleAttr: Int, defStyleRes: Int): TypedArray {
protected fun obtainStyledAttrs(context: Context, set: AttributeSet?, styleableRes: IntArray, defStyleAttr: Int, defStyleRes: Int): TypedArray {
return context.obtainStyledAttributes(set, styleableRes, defStyleAttr, defStyleRes)
}
private fun getAttrString(a: TypedArray, index: Int): String? = a.getString(index)
protected fun getAttrString(a: TypedArray, index: Int): String? = a.getString(index)
}

View File

@@ -9,12 +9,10 @@ import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.os.Process
import android.util.Log
import android.view.Gravity
import android.view.Menu
import android.view.MenuItem
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.appcompat.widget.SearchView
import androidx.drawerlayout.widget.DrawerLayout
@@ -40,7 +38,7 @@ import org.autojs.autojs.event.BackPressedHandler.HostActivity
import org.autojs.autojs.model.explorer.Explorers
import org.autojs.autojs.permission.DisplayOverOtherAppsPermission
import org.autojs.autojs.permission.ManageAllFilesPermission
import org.autojs.autojs.permission.PostNotificationPermission
import org.autojs.autojs.permission.PostNotificationsPermission
import org.autojs.autojs.runtime.api.WrappedShizuku
import org.autojs.autojs.service.ForegroundService
import org.autojs.autojs.theme.ThemeColorManager
@@ -120,15 +118,6 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
return -1
}
val requestMultiplePermissionsLauncher = registerForActivityResult(RequestMultiplePermissions()) {
it.forEach { (key: String, isGranted: Boolean) ->
Log.d(TAG, "$key: $isGranted")
if (key == Manifest.permission.POST_NOTIFICATIONS) {
Pref.putBoolean(R.string.key_post_notification_permission_requested, true)
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -156,7 +145,7 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
FloatyWindowManger.refreshCircularMenuIfNeeded(this)
PostNotificationPermission(this).urgeIfNeeded()
PostNotificationsPermission(this).urgeIfNeeded()
ManageAllFilesPermission(this).urgeIfNeeded()
DisplayOverOtherAppsPermission(this).urgeIfNeeded()
}
@@ -453,7 +442,6 @@ class MainActivity : BaseActivity(), DelegateHost, HostActivity {
companion object {
private val TAG = MainActivity::class.java.simpleName
private var sIsActionBarDrawerOpened = false
var shouldRecreateMainActivity = false

View File

@@ -19,7 +19,7 @@ import org.autojs.autojs.core.pref.Pref
import org.autojs.autojs.permission.DisplayOverOtherAppsPermission
import org.autojs.autojs.permission.IgnoreBatteryOptimizationsPermission
import org.autojs.autojs.permission.MediaProjectionPermission
import org.autojs.autojs.permission.PostNotificationPermission
import org.autojs.autojs.permission.PostNotificationsPermission
import org.autojs.autojs.permission.ShizukuPermission
import org.autojs.autojs.permission.UsageStatsPermission
import org.autojs.autojs.permission.WriteSecureSettingsPermission
@@ -221,7 +221,7 @@ open class DrawerFragment : Fragment() {
}
mNotificationPostItem = DrawerMenuToggleableItem(
PostNotificationPermission(mContext),
PostNotificationsPermission(mContext),
R.drawable.ic_ali_notification,
R.string.text_post_notifications_permission,
)

View File

@@ -956,5 +956,12 @@
<string name="text_write_secure_settings">اكتب إعدادات الأمان</string>
<string name="text_write_secure_settings_description">إعدادات النظام الآمنة ، التي تحتوي على تفضيلات النظام التي يمكن أن تقرأها التطبيقات ولكن لا يُسمح لها بالكتابة.\nهذه هي لتفضيلات يجب على المستخدم تعديلها بشكل صريح من خلال واجهة المستخدم لتطبيق النظام.\nمع إذن إعدادات النظام الآمن ، يمكن للتطبيقات العادية تعديل الإعدادات الآمنة مباشرة (مثل خدمة إمكانية الوصول).</string>
<string name="text_write_system_settings">كتابة إعدادات النظام</string>
<string name="text_special_permissions">أذونات خاصة</string>
<string name="summary_all_files_access">يسمح لـ AutoJs6 بالوصول إلى جميع الملفات، بما في ذلك الملفات الموجودة على التخزين الخارجي</string>
<string name="summary_display_over_other_apps">يسمح لـ AutoJs6 بعرض المحتوى فوق التطبيقات الأخرى</string>
<string name="summary_post_notifications_permission">يسمح لـ AutoJs6 بإنشاء وإرسال الإشعارات</string>
<string name="summary_all_files_access_inrt">السماح للتطبيق بالوصول إلى جميع الملفات، بما في ذلك التخزين الخارجي</string>
<string name="summary_display_over_other_apps_inrt">السماح للتطبيق بعرض المحتوى فوق التطبيقات الأخرى</string>
<string name="summary_post_notifications_permission_inrt">السماح للتطبيق بإنشاء وإرسال الإشعارات</string>
</resources>

View File

@@ -952,5 +952,12 @@
<string name="text_confirm_to_clear_histories_of">All histories below will be cleared\n\n[ %1$s ]\n\nAre you sure to clear them all?</string>
<string name="text_confirm_to_clear_histories_of_all_color_libraries">All histories below will be cleared\n\n[ All color libraries ]\n\nAre you sure to clear them all?</string>
<string name="text_all_histories">All histories</string>
<string name="text_special_permissions">Special permissions</string>
<string name="summary_all_files_access">Allows AutoJs6 to access all files, including those in external storage</string>
<string name="summary_display_over_other_apps">Allows AutoJs6 to display content over other apps</string>
<string name="summary_post_notifications_permission">Allows AutoJs6 to create and post notifications</string>
<string name="summary_all_files_access_inrt">Allow the application to access all files, including external storage</string>
<string name="summary_display_over_other_apps_inrt">Allow the application to display content over other apps</string>
<string name="summary_post_notifications_permission_inrt">Allow the application to create and send notifications</string>
</resources>

View File

@@ -955,5 +955,12 @@
<string name="text_write_secure_settings">Escribir la configuración de seguridad</string>
<string name="text_write_secure_settings_description">Ajustes de seguridad del sistema, que contienen preferencias del sistema que las aplicaciones pueden leer pero no pueden escribir.\nSe trata de preferencias que el usuario debe modificar explícitamente a través de la interfaz de usuario de una aplicación del sistema.\nCon el permiso de configuración segura del sistema, las aplicaciones normales pueden modificar directamente la configuración segura (como el servicio de accesibilidad).</string>
<string name="text_write_system_settings">Escribir la configuración del sistema</string>
<string name="text_special_permissions">Permisos especiales</string>
<string name="summary_all_files_access">Permite que AutoJs6 acceda a todos los archivos, incluidos los del almacenamiento externo</string>
<string name="summary_display_over_other_apps">Permite que AutoJs6 muestre contenido encima de otras aplicaciones</string>
<string name="summary_post_notifications_permission">Permite que AutoJs6 cree y envíe notificaciones</string>
<string name="summary_all_files_access_inrt">Permitir que la aplicación acceda a todos los archivos, incluido el almacenamiento externo</string>
<string name="summary_display_over_other_apps_inrt">Permitir que la aplicación muestre contenido sobre otras aplicaciones</string>
<string name="summary_post_notifications_permission_inrt">Permitir que la aplicación cree y envíe notificaciones</string>
</resources>

View File

@@ -955,5 +955,12 @@
<string name="text_write_secure_settings">Écrire les paramètres de sécurité</string>.
<string name="text_write_secure_settings_description">Paramètres de sécurité du système, contenant les préférences du système que les applications peuvent lire mais ne sont pas autorisées à écrire.\nIl s\'agit des préférences que l\'utilisateur doit explicitement modifier par le biais de l\'interface utilisateur d\'une application système.\nAvec l\'autorisation de paramètres de sécurité du système, les applications normales peuvent directement modifier les paramètres de sécurité (comme le service d\'accessibilité).</string>
<string name="text_write_system_settings">Écrire les paramètres système</string>
<string name="text_special_permissions">Autorisations spéciales</string>
<string name="summary_all_files_access">Permet à AutoJs6 d\'accéder à tous les fichiers, y compris ceux du stockage externe</string>
<string name="summary_display_over_other_apps">Permet à AutoJs6 d\'afficher du contenu au-dessus d\'autres applications</string>
<string name="summary_post_notifications_permission">Permet à AutoJs6 de créer et d\'envoyer des notifications</string>
<string name="summary_all_files_access_inrt">Autoriser l\'application à accéder à tous les fichiers, y compris le stockage externe</string>
<string name="summary_display_over_other_apps_inrt">Autoriser l\'application à afficher du contenu par-dessus d\'autres applications</string>
<string name="summary_post_notifications_permission_inrt">Autoriser l\'application à créer et envoyer des notifications</string>
</resources>

View File

@@ -955,5 +955,12 @@
<string name="text_write_secure_settings">セキュリティ設定の書き込み</string>
<string name="text_write_secure_settings_description">アプリケーションが読み取ることはできるが, 書き込むことはできないシステム環境設定を含む, 安全なシステム設定です.\nこれは, ユーザーがシステムアプリの UI を通じて明示的に変更する必要がある環境設定のためのものです.\nセキュアなシステム設定を許可すると, 通常のアプリケーションはセキュアな設定 (アクセシビリティサービスなど) を直接変更できるようになります</string>
<string name="text_write_system_settings">システム設定の書き込み</string>
<string name="text_special_permissions">特殊な権限</string>
<string name="summary_all_files_access">AutoJs6 が外部ストレージを含むすべてのファイルにアクセスすることを許可します</string>
<string name="summary_display_over_other_apps">AutoJs6 が他のアプリの上にコンテンツを表示することを許可します</string>
<string name="summary_post_notifications_permission">AutoJs6 が通知を作成して送信することを許可します</string>
<string name="summary_all_files_access_inrt">アプリが外部ストレージを含むすべてのファイルにアクセスすることを許可する</string>
<string name="summary_display_over_other_apps_inrt">アプリが他のアプリの上にコンテンツを表示することを許可する</string>
<string name="summary_post_notifications_permission_inrt">アプリが通知を作成して送信することを許可する</string>
</resources>

View File

@@ -956,5 +956,12 @@
<string name="text_write_secure_settings">보안 설정을 작성하십시오</string>
<string name="text_write_secure_settings_description">애플리케이션이 읽을 수 있지만 쓸 수없는 시스템 환경 설정을 포함하는 보안 시스템 설정.\n이들은 사용자가 시스템 앱의 UI 를 통해 명시 적으로 수정 해야하는 선호도입니다.\n보안 시스템 설정 권한을 사용하면 일반 애플리케이션이 보안 설정 (예: 접근성 서비스)을 직접 수정할 수 있습니다.</string>
<string name="text_write_system_settings">시스템 설정을 작성하십시오</string>
<string name="text_special_permissions">특수 권한</string>
<string name="summary_all_files_access">AutoJs6 가 외부 저장소를 포함한 모든 파일에 접근할 수 있도록 허용합니다</string>
<string name="summary_display_over_other_apps">AutoJs6 가 다른 애플리케이션 위에 콘텐츠를 표시할 수 있도록 허용합니다</string>
<string name="summary_post_notifications_permission">AutoJs6 가 알림을 생성하고 보낼 수 있도록 허용합니다</string>
<string name="summary_all_files_access_inrt">앱이 외부 저장소를 포함한 모든 파일에 접근할 수 있도록 허용합니다</string>
<string name="summary_display_over_other_apps_inrt">앱이 다른 애플리케이션 위에 콘텐츠를 표시할 수 있도록 허용합니다</string>
<string name="summary_post_notifications_permission_inrt">앱이 알림을 생성하고 보낼 수 있도록 허용합니다</string>
</resources>

View File

@@ -955,5 +955,12 @@
<string name="text_write_secure_settings">Параметры безопасности записи</string>
<string name="text_write_secure_settings_description">Настройки безопасности системы, содержащие системные предпочтения, которые приложения могут читать, но не имеют права записывать.\nОни предназначены для параметров, которые пользователь должен явно изменить через пользовательский интерфейс системного приложения.\nПри наличии разрешения на безопасные системные настройки обычные приложения могут напрямую изменять безопасные настройки (например, служба доступности).</string>
<string name="text_write_system_settings">Запись системных настроек</string>
<string name="text_special_permissions">Специальные разрешения</string>
<string name="summary_all_files_access">Позволяет AutoJs6 получать доступ ко всем файлам, включая файлы на внешнем хранилище</string>
<string name="summary_display_over_other_apps">Позволяет AutoJs6 отображать контент поверх других приложений</string>
<string name="summary_post_notifications_permission">Позволяет AutoJs6 создавать и отправлять уведомления</string>
<string name="summary_all_files_access_inrt">Разрешить приложению доступ ко всем файлам, включая внешнее хранилище</string>
<string name="summary_display_over_other_apps_inrt">Разрешить приложению отображать контент поверх других приложений</string>
<string name="summary_post_notifications_permission_inrt">Разрешить приложению создавать и отправлять уведомления</string>
</resources>

View File

@@ -953,5 +953,12 @@
<string name="text_write_secure_settings">修改安全設置</string>
<string name="text_write_secure_settings_description">安全設置包含應用程序可讀但不可寫入的設置選項, 這些選項只能由 UI 或系統級別應用修改.\n被授予 \"修改安全設置權限\" 後, 普通應用可直接修改上述安全設置 (例如無障礙服務).</string>
<string name="text_write_system_settings">修改系統設置</string>
<string name="text_special_permissions">特殊權限</string>
<string name="summary_all_files_access">允許 AutoJs6 訪問所有文件, 包括外部存儲</string>
<string name="summary_display_over_other_apps">允許 AutoJs6 在其他應用之上顯示內容</string>
<string name="summary_post_notifications_permission">允許 AutoJs6 創建併發送通知</string>
<string name="summary_all_files_access_inrt">允許應用訪問所有文件, 包括外部存儲</string>
<string name="summary_display_over_other_apps_inrt">允許應用在其他應用之上顯示內容</string>
<string name="summary_post_notifications_permission_inrt">允許應用創建併發送通知</string>
</resources>

View File

@@ -953,5 +953,12 @@
<string name="text_write_secure_settings">修改安全設定</string>
<string name="text_write_secure_settings_description">安全設定包含應用程式可讀但不可寫入的設定選項, 這些選項只能由 UI 或系統級別應用修改.\n被授予 \"修改安全設定許可權\" 後, 普通應用可直接修改上述安全設定 (例如無障礙服務).</string>
<string name="text_write_system_settings">修改系統設定</string>
<string name="text_special_permissions">特殊許可權</string>
<string name="summary_all_files_access">允許 AutoJs6 訪問所有檔案, 包括外部儲存</string>
<string name="summary_display_over_other_apps">允許 AutoJs6 在其他應用之上顯示內容</string>
<string name="summary_post_notifications_permission">允許 AutoJs6 建立併發送通知</string>
<string name="summary_all_files_access_inrt">允許應用訪問所有檔案, 包括外部儲存</string>
<string name="summary_display_over_other_apps_inrt">允許應用在其他應用之上顯示內容</string>
<string name="summary_post_notifications_permission_inrt">允許應用建立併發送通知</string>
</resources>

View File

@@ -950,5 +950,12 @@
<string name="text_write_secure_settings">修改安全设置</string>
<string name="text_write_secure_settings_description">安全设置包含应用程序可读但不可写入的设置选项, 这些选项只能由 UI 或系统级别应用修改.\n被授予 \"修改安全设置权限\" 后, 普通应用可直接修改上述安全设置 (例如无障碍服务).</string>
<string name="text_write_system_settings">修改系统设置</string>
<string name="text_special_permissions">特殊权限</string>
<string name="summary_all_files_access">允许 AutoJs6 访问所有文件, 包括外部存储</string>
<string name="summary_display_over_other_apps">允许 AutoJs6 在其他应用之上显示内容</string>
<string name="summary_post_notifications_permission">允许 AutoJs6 创建并发送通知</string>
<string name="summary_all_files_access_inrt">允许应用访问所有文件, 包括外部存储</string>
<string name="summary_display_over_other_apps_inrt">允许应用在其他应用之上显示内容</string>
<string name="summary_post_notifications_permission_inrt">允许应用创建并发送通知</string>
</resources>

View File

@@ -1197,5 +1197,15 @@
<string name="text_confirm_to_clear_histories_of">All histories below will be cleared\n\n[ %1$s ]\n\nAre you sure to clear them all?</string>
<string name="text_confirm_to_clear_histories_of_all_color_libraries">All histories below will be cleared\n\n[ All color libraries ]\n\nAre you sure to clear them all?</string>
<string name="text_all_histories">All histories</string>
<string name="text_special_permissions">Special permissions</string>
<string name="key_post_notifications_permission" translatable="false">key_$_post_notifications_permission</string>
<string name="key_display_over_other_apps" translatable="false">key_$_display_over_other_apps</string>
<string name="key_all_files_access" translatable="false">key_$_all_files_access</string>
<string name="summary_all_files_access">Allows AutoJs6 to access all files, including those in external storage</string>
<string name="summary_display_over_other_apps">Allows AutoJs6 to display content over other apps</string>
<string name="summary_post_notifications_permission">Allows AutoJs6 to create and post notifications</string>
<string name="summary_all_files_access_inrt">Allow the application to access all files, including external storage</string>
<string name="summary_display_over_other_apps_inrt">Allow the application to display content over other apps</string>
<string name="summary_post_notifications_permission_inrt">Allow the application to create and send notifications</string>
</resources>

View File

@@ -38,9 +38,9 @@
<item name="colorControlNormal">@color/md_black_1000</item>
</style>
<style name="AppTheme.LogActivityInrt" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/md_blue_gray_600</item>
<item name="android:windowLightStatusBar">false</item>
<style name="AppTheme.NoActionBarInrt" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/md_blue_gray_50</item>
<item name="android:windowLightStatusBar">true</item>
<item name="colorPrimary">@color/md_blue_gray_50</item>
<item name="colorPrimaryDark">@color/md_blue_gray_50</item>
<item name="colorAccent">@color/md_black_1000</item>

View File

@@ -1,38 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="@string/text_script_running">
<org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_script_running">
<SwitchPreference
android:defaultValue="true"
android:key="@string/key_use_volume_control_running"
android:title="@string/text_use_volume_key_to_control_script_running" />
<org.autojs.autojs.theme.preference.ThemeColorSwitchPreference
android:defaultValue="true"
android:key="@string/key_use_volume_control_running"
android:title="@string/text_use_volume_key_to_control_script_running" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_not_showing_main_activity"
android:summary="@string/summary_not_showing_main_activity"
android:title="@string/text_not_showing_main_activity" />
<org.autojs.autojs.theme.preference.ThemeColorSwitchPreference
android:defaultValue="false"
android:key="@string/key_not_showing_main_activity"
android:summary="@string/summary_not_showing_main_activity"
android:title="@string/text_not_showing_main_activity" />
</PreferenceCategory>
</org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory>
<PreferenceCategory android:title="@string/text_a11y_service">
<org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_a11y_service">
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_enable_a11y_service_with_root_access"
android:summary="@string/summary_enable_a11y_service_with_root_access"
android:title="@string/text_enable_a11y_service_with_root_access_automatically" />
<org.autojs.autojs.theme.preference.ThemeColorSwitchPreference
android:defaultValue="false"
android:key="@string/key_enable_a11y_service_with_root_access"
android:summary="@string/summary_enable_a11y_service_with_root_access"
android:title="@string/text_enable_a11y_service_with_root_access_automatically" />
<SwitchPreference
android:defaultValue="false"
android:key="@string/key_stable_mode"
android:summary="@string/summary_stable_mode"
android:title="@string/text_stable_mode" />
<org.autojs.autojs.theme.preference.ThemeColorSwitchPreference
android:defaultValue="false"
android:key="@string/key_stable_mode"
android:summary="@string/summary_stable_mode"
android:title="@string/text_stable_mode" />
</PreferenceCategory>
</org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory>
<PreferenceCategory android:title="@string/text_others" />
<org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory android:title="@string/text_special_permissions">
<org.autojs.autojs.inrt.theme.preference.ManageAllFilesPermissionSwitchPreference
android:key="@string/key_all_files_access"
android:summary="@string/summary_all_files_access_inrt"
android:title="@string/text_all_files_access" />
<org.autojs.autojs.inrt.theme.preference.DisplayOverOtherAppsPermissionSwitchPreference
android:key="@string/key_display_over_other_apps"
android:summary="@string/summary_display_over_other_apps_inrt"
android:title="@string/text_display_over_other_app" />
<org.autojs.autojs.inrt.theme.preference.PostNotificationsPermissionSwitchPreference
android:key="@string/key_post_notifications_permission"
android:summary="@string/summary_post_notifications_permission_inrt"
android:title="@string/text_post_notifications_permission" />
</org.autojs.autojs.theme.preference.ThemeColorPreferenceCategory>
</PreferenceScreen>