6.6.3 - Alpha2 - 修复定时任务页面自定义广播内容的输入法遮挡问题

This commit is contained in:
SuperMonster003
2025-05-09 17:12:38 +08:00
parent f20b08a169
commit 3663c4273e
3 changed files with 233 additions and 136 deletions

View File

@@ -12,6 +12,7 @@
"部分设备代码编辑器空行显示方框字符的问题", "部分设备代码编辑器空行显示方框字符的问题",
"主题色设置页面调色盘对话框可能无限叠加的问题", "主题色设置页面调色盘对话框可能无限叠加的问题",
"无障碍服务关闭时音量加键停止所有脚本功能失效的问题", "无障碍服务关闭时音量加键停止所有脚本功能失效的问题",
"定时任务页面编辑自定义广播内容时出现的输入法遮挡问题",
"APK 文件类型信息对话框可能无法获取应用名称及 SDK 信息的问题", "APK 文件类型信息对话框可能无法获取应用名称及 SDK 信息的问题",
"Android 15 部分页面状态栏背景颜色可能无法动态跟随主题色的问题", "Android 15 部分页面状态栏背景颜色可能无法动态跟随主题色的问题",
"dialogs 模块无法正常使用 customView 属性的问题 _[`issue #364`](http://issues.autojs6.com/364)_", "dialogs 模块无法正常使用 customView 属性的问题 _[`issue #364`](http://issues.autojs6.com/364)_",

View File

@@ -16,8 +16,11 @@ import android.view.WindowManager;
import android.widget.AbsListView; import android.widget.AbsListView;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.Switch; import android.widget.Switch;
import androidx.annotation.ColorInt;
import androidx.appcompat.widget.SwitchCompat; import androidx.appcompat.widget.SwitchCompat;
import androidx.core.graphics.drawable.DrawableCompat; import androidx.core.graphics.drawable.DrawableCompat;
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog;
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog;
import org.autojs.autojs.theme.internal.ScrollingViewEdgeGlowColorHelper; import org.autojs.autojs.theme.internal.ScrollingViewEdgeGlowColorHelper;
import org.autojs.autojs.util.ColorUtils; import org.autojs.autojs.util.ColorUtils;
import org.autojs.autojs.util.ViewUtils; import org.autojs.autojs.util.ViewUtils;
@@ -57,6 +60,28 @@ public class ThemeColorHelper {
} }
} }
public static void setThemeColorPrimary(TimePickerDialog timePickerDialog, Context context, boolean contrastMatters) {
setThemeColorPrimary(timePickerDialog, context, ThemeColorManager.getColorPrimary(), contrastMatters);
}
public static void setThemeColorPrimary(TimePickerDialog timePickerDialog, Context context, @ColorInt int color, boolean contrastMatters) {
if (contrastMatters) {
color = ColorUtils.adjustColorForContrast(context.getColor(R.color.window_background), color, 2.3);
}
timePickerDialog.setAccentColor(color);
}
public static void setThemeColorPrimary(DatePickerDialog datePickerDialog, Context context, boolean contrastMatters) {
setThemeColorPrimary(datePickerDialog, context, ThemeColorManager.getColorPrimary(), contrastMatters);
}
public static void setThemeColorPrimary(DatePickerDialog datePickerDialog, Context context, @ColorInt int color, boolean contrastMatters) {
if (contrastMatters) {
color = ColorUtils.adjustColorForContrast(context.getColor(R.color.window_background), color, 2.3);
}
datePickerDialog.setAccentColor(color);
}
public static void setColorPrimary(SwitchCompat switchCompat, int color) { public static void setColorPrimary(SwitchCompat switchCompat, int color) {
setColorPrimary(switchCompat, color, false); setColorPrimary(switchCompat, color, false);
} }

View File

@@ -1,13 +1,9 @@
package org.autojs.autojs.ui.timing package org.autojs.autojs.ui.timing
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import android.content.ActivityNotFoundException import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent import android.content.Intent
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.os.PowerManager import android.os.PowerManager
import android.provider.Settings import android.provider.Settings
@@ -26,6 +22,11 @@ import android.widget.RadioGroup
import android.widget.TextView import android.widget.TextView
import android.widget.TimePicker import android.widget.TimePicker
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.graphics.Insets
import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.forEach
import com.github.aakira.expandablelayout.ExpandableRelativeLayout import com.github.aakira.expandablelayout.ExpandableRelativeLayout
import org.autojs.autojs.core.ui.BiMaps import org.autojs.autojs.core.ui.BiMaps
import org.autojs.autojs.execution.ExecutionConfig import org.autojs.autojs.execution.ExecutionConfig
@@ -33,6 +34,7 @@ import org.autojs.autojs.execution.ExecutionConfig.CREATOR.default
import org.autojs.autojs.external.ScriptIntents import org.autojs.autojs.external.ScriptIntents
import org.autojs.autojs.external.receiver.DynamicBroadcastReceivers import org.autojs.autojs.external.receiver.DynamicBroadcastReceivers
import org.autojs.autojs.model.script.ScriptFile import org.autojs.autojs.model.script.ScriptFile
import org.autojs.autojs.theme.ThemeColorHelper
import org.autojs.autojs.timing.IntentTask import org.autojs.autojs.timing.IntentTask
import org.autojs.autojs.timing.TaskReceiver import org.autojs.autojs.timing.TaskReceiver
import org.autojs.autojs.timing.TimedTask import org.autojs.autojs.timing.TimedTask
@@ -44,6 +46,7 @@ import org.autojs.autojs.timing.TimedTaskManager.updateTask
import org.autojs.autojs.tool.MapBuilder import org.autojs.autojs.tool.MapBuilder
import org.autojs.autojs.ui.BaseActivity import org.autojs.autojs.ui.BaseActivity
import org.autojs.autojs.util.ViewUtils import org.autojs.autojs.util.ViewUtils
import org.autojs.autojs.util.ViewUtils.setMenuIconsColorByThemeColorLuminance
import org.autojs.autojs.util.ViewUtils.showToast import org.autojs.autojs.util.ViewUtils.showToast
import org.autojs.autojs6.R import org.autojs.autojs6.R
import org.autojs.autojs6.databinding.ActivityTimedTaskSettingBinding import org.autojs.autojs6.databinding.ActivityTimedTaskSettingBinding
@@ -51,6 +54,8 @@ import org.joda.time.LocalDate
import org.joda.time.LocalDateTime import org.joda.time.LocalDateTime
import org.joda.time.LocalTime import org.joda.time.LocalTime
import org.joda.time.format.DateTimeFormat import org.joda.time.format.DateTimeFormat
import com.wdullaer.materialdatetimepicker.date.DatePickerDialog as MaterialDatePickerDialog
import com.wdullaer.materialdatetimepicker.time.TimePickerDialog as MaterialTimePickerDialog
/** /**
* Created by Stardust on Nov 28, 2017. * Created by Stardust on Nov 28, 2017.
@@ -64,8 +69,8 @@ class TimedTaskSettingActivity : BaseActivity() {
private lateinit var mDailyTaskRadio: RadioButton private lateinit var mDailyTaskRadio: RadioButton
private lateinit var mWeeklyTaskRadio: RadioButton private lateinit var mWeeklyTaskRadio: RadioButton
private lateinit var mRunOnBroadcastRadio: RadioButton private lateinit var mRunOnBroadcastRadio: RadioButton
private lateinit var mRunOnOtherBroadcast: RadioButton private lateinit var mRunOnCustomBroadcast: RadioButton
private lateinit var mOtherBroadcastAction: EditText private lateinit var mCustomBroadcastAction: EditText
private lateinit var mBroadcastGroup: RadioGroup private lateinit var mBroadcastGroup: RadioGroup
private lateinit var mDisposableTaskTime: TextView private lateinit var mDisposableTaskTime: TextView
private lateinit var mDisposableTaskDate: TextView private lateinit var mDisposableTaskDate: TextView
@@ -74,9 +79,10 @@ class TimedTaskSettingActivity : BaseActivity() {
private lateinit var mWeeklyTaskContainer: LinearLayout private lateinit var mWeeklyTaskContainer: LinearLayout
private val mDayOfWeekCheckBoxes: MutableList<CheckBox> = ArrayList() private val mDayOfWeekCheckBoxes: MutableList<CheckBox> = ArrayList()
private var mScriptFile: ScriptFile? = null
private var mTimedTask: TimedTask? = null private var mTimedTask: TimedTask? = null
private var mIntentTask: IntentTask? = null private var mIntentTask: IntentTask? = null
private lateinit var mScriptFile: ScriptFile
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -86,129 +92,179 @@ class TimedTaskSettingActivity : BaseActivity() {
mToolbar = binding.toolbar mToolbar = binding.toolbar
mTimingGroup = binding.timingGroup mTimingGroup = binding.timingGroup
mRunOnOtherBroadcast = binding.runOnOtherBroadcast mRunOnCustomBroadcast = binding.runOnCustomBroadcast
mOtherBroadcastAction = binding.action mCustomBroadcastAction = binding.action.apply {
mBroadcastGroup = binding.broadcastGroup setOnFocusChangeListener { _, hasFocus ->
mDailyTaskTimePicker = binding.dailyTaskTimePicker if (hasFocus) {
mWeeklyTaskTimePicker = binding.weeklyTaskTimePicker mRunOnCustomBroadcast.isChecked = true
mWeeklyTaskContainer = binding.weeklyTaskContainer }
}
}
mBroadcastGroup = binding.broadcastGroup.apply {
setUpRadioButtonListeners()
}
mWeeklyTaskContainer = binding.weeklyTaskContainer.apply {
setUpDayOfWeekCheckBoxes()
}
mWeeklyTaskTimePicker = binding.weeklyTaskTimePicker.apply {
setIs24HourView(true)
}
mDailyTaskTimePicker = binding.dailyTaskTimePicker.apply {
setIs24HourView(true)
}
mDailyTaskRadio = binding.dailyTaskRadio.apply { mDailyTaskRadio = binding.dailyTaskRadio.apply {
setOnCheckedChangeListener { buttonView, _ -> onCheckedChanged(buttonView) } setUpRadioButton()
} }
mWeeklyTaskRadio = binding.weeklyTaskRadio.apply { mWeeklyTaskRadio = binding.weeklyTaskRadio.apply {
setOnCheckedChangeListener { buttonView, _ -> onCheckedChanged(buttonView) } setUpRadioButton()
} }
mDisposableTaskRadio = binding.disposableTaskRadio.apply { mDisposableTaskRadio = binding.disposableTaskRadio.apply {
setOnCheckedChangeListener { buttonView, _ -> onCheckedChanged(buttonView) } setUpRadioButton()
} }
mRunOnBroadcastRadio = binding.runOnBroadcast.apply { mRunOnBroadcastRadio = binding.runOnBroadcast.apply {
setOnCheckedChangeListener { buttonView, _ -> onCheckedChanged(buttonView) } setUpRadioButton()
} }
mDisposableTaskTime = binding.disposableTaskTime.apply { mDisposableTaskTime = binding.disposableTaskTime.apply {
text = TIME_FORMATTER.print(LocalTime.now())
setOnClickListener { showDisposableTaskTimePicker() } setOnClickListener { showDisposableTaskTimePicker() }
} }
mDisposableTaskDate = binding.disposableTaskDate.apply { mDisposableTaskDate = binding.disposableTaskDate.apply {
text = DATE_FORMATTER.print(LocalDate.now())
setOnClickListener { showDisposableTaskDatePicker() } setOnClickListener { showDisposableTaskDatePicker() }
} }
val taskId = intent.getLongExtra(EXTRA_TASK_ID, -1) loadTaskFromIntent()
if (taskId != -1L) {
mTimedTask = getTimedTask(taskId)
if (mTimedTask != null) {
mScriptFile = ScriptFile(mTimedTask!!.scriptPath)
}
} else {
val intentTaskId = intent.getLongExtra(EXTRA_INTENT_TASK_ID, -1)
if (intentTaskId != -1L) {
mIntentTask = getIntentTask(intentTaskId)
if (mIntentTask != null) {
mScriptFile = ScriptFile(mIntentTask!!.scriptPath)
}
} else {
val path = intent.getStringExtra(ScriptIntents.EXTRA_KEY_PATH)
if (TextUtils.isEmpty(path)) {
finish()
}
mScriptFile = ScriptFile(path)
}
}
setToolbarAsBack(R.string.text_timed_task) setToolbarAsBack(R.string.text_timed_task)
mToolbar.subtitle = mScriptFile!!.name mToolbar.subtitle = mScriptFile.name
mDailyTaskTimePicker.setIs24HourView(true)
mWeeklyTaskTimePicker.setIs24HourView(true) setUpTaskSettings()
findDayOfWeekCheckBoxes(mWeeklyTaskContainer)
setUpTaskSettings(this)
ViewUtils.excludePaddingClippableViewFromNavigationBar(binding.scrollView) ViewUtils.excludePaddingClippableViewFromNavigationBar(binding.scrollView)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { v, insets ->
val sysBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
v.setPadding(0, 0, 0, maxOf(sysBars.bottom, ime.bottom))
// 只把 IME 的 inset 标记为已消费, 其余继续下传
val outInsets = WindowInsetsCompat.Builder(insets)
.setInsets(WindowInsetsCompat.Type.ime(), Insets.NONE)
.build()
outInsets
}
} }
private fun findDayOfWeekCheckBoxes(parent: ViewGroup) { private fun loadTaskFromIntent() {
for (i in 0 until parent.childCount) { when (val taskId = intent.getLongExtra(EXTRA_TASK_ID, -1)) {
val child = parent.getChildAt(i) -1L -> when (val intentTaskId = intent.getLongExtra(EXTRA_INTENT_TASK_ID, -1)) {
-1L -> {
val path = intent.getStringExtra(ScriptIntents.EXTRA_KEY_PATH)
if (TextUtils.isEmpty(path)) {
finish()
}
mScriptFile = ScriptFile(path)
}
else -> mIntentTask = getIntentTask(intentTaskId)?.also {
mScriptFile = ScriptFile(it.scriptPath)
}
}
else -> mTimedTask = getTimedTask(taskId)?.also {
mScriptFile = ScriptFile(it.scriptPath)
}
}
}
private fun RadioGroup.setUpRadioButtonListeners() {
forEach { view ->
if (view !is RadioButton) {
return@forEach
}
view.setOnClickListener {
mCustomBroadcastAction.apply {
if (view == mRunOnCustomBroadcast) {
requestFocus()
setSelection(length())
ViewUtils.showSoftInput(this)
} else {
clearFocus()
ViewUtils.hideSoftInput(this)
}
}
}
}
}
private fun RadioButton.setUpRadioButton() {
setOnCheckedChangeListener { buttonView, _ -> onCheckedChanged(buttonView) }
}
private fun ViewGroup.setUpDayOfWeekCheckBoxes() {
for (i in 0 until this.childCount) {
val child = this.getChildAt(i)
if (child is CheckBox) { if (child is CheckBox) {
mDayOfWeekCheckBoxes.add(child) mDayOfWeekCheckBoxes.add(child)
} else if (child is ViewGroup) { } else if (child is ViewGroup) {
findDayOfWeekCheckBoxes(child) child.setUpDayOfWeekCheckBoxes()
} }
if (mDayOfWeekCheckBoxes.size >= 7) break if (mDayOfWeekCheckBoxes.size >= 7) break
} }
} }
private fun setUpTaskSettings(context: Context) { private fun setUpTaskSettings() {
mDisposableTaskDate.text = DATE_FORMATTER.print(LocalDate.now()) mTimedTask?.let {
mDisposableTaskTime.text = TIME_FORMATTER.print(LocalTime.now()) setUpTime(it)
if (mTimedTask != null) {
setupTime(context)
return return
} }
if (mIntentTask != null) { mIntentTask?.let {
setupAction() setUpAction(it)
return return
} }
mDailyTaskRadio.isChecked = true mDailyTaskRadio.isChecked = true
} }
private fun setupAction() { private fun setUpTime(timedTask: TimedTask) {
if (timedTask.isDisposable) {
mDisposableTaskRadio.isChecked = true
mDisposableTaskTime.text = TIME_FORMATTER.print(timedTask.millis)
mDisposableTaskDate.text = DATE_FORMATTER.print(timedTask.millis)
return
}
val time = LocalTime.fromMillisOfDay(timedTask.millis)
mDailyTaskTimePicker.hour = time.hourOfDay
mDailyTaskTimePicker.minute = time.minuteOfHour
mWeeklyTaskTimePicker.hour = time.hourOfDay
mWeeklyTaskTimePicker.minute = time.minuteOfHour
if (timedTask.isDaily) {
mDailyTaskRadio.isChecked = true
} else {
mWeeklyTaskRadio.isChecked = true
for (i in mDayOfWeekCheckBoxes.indices) {
mDayOfWeekCheckBoxes[i].isChecked = timedTask.hasDayOfWeek(this, i + 1)
}
}
}
private fun setUpAction(intentTask: IntentTask) {
mRunOnBroadcastRadio.isChecked = true mRunOnBroadcastRadio.isChecked = true
val buttonId = ACTIONS.getKey(mIntentTask!!.action) val buttonId = ACTIONS.getKey(intentTask.action)
if (buttonId == null) { if (buttonId == null) {
mRunOnOtherBroadcast.isChecked = true mRunOnCustomBroadcast.isChecked = true
mOtherBroadcastAction.setText(mIntentTask!!.action) mCustomBroadcastAction.setText(intentTask.action)
} else { } else {
(findViewById<View>(buttonId) as RadioButton).isChecked = true (findViewById<View>(buttonId) as RadioButton).isChecked = true
} }
} }
private fun setupTime(context: Context) { fun onCheckedChanged(button: CompoundButton) {
if (mTimedTask!!.isDisposable) { findExpandableLayoutOf(button).run {
mDisposableTaskRadio.isChecked = true when (button.isChecked) {
mDisposableTaskTime.text = TIME_FORMATTER.print(mTimedTask!!.millis) true -> post { expand() }
mDisposableTaskDate.text = DATE_FORMATTER.print(mTimedTask!!.millis) else -> post { collapse() }
return
}
val time = LocalTime.fromMillisOfDay(mTimedTask!!.millis)
mDailyTaskTimePicker.hour = time.hourOfDay
mDailyTaskTimePicker.minute = time.minuteOfHour
mWeeklyTaskTimePicker.hour = time.hourOfDay
mWeeklyTaskTimePicker.minute = time.minuteOfHour
if (mTimedTask!!.isDaily) {
mDailyTaskRadio.isChecked = true
} else {
mWeeklyTaskRadio.isChecked = true
for (i in mDayOfWeekCheckBoxes.indices) {
mDayOfWeekCheckBoxes[i].isChecked = mTimedTask!!.hasDayOfWeek(context, i + 1)
} }
} }
} ViewUtils.hideSoftInput(mCustomBroadcastAction)
fun onCheckedChanged(button: CompoundButton) {
val relativeLayout = findExpandableLayoutOf(button)
if (button.isChecked) {
relativeLayout.post { relativeLayout.expand() }
} else {
relativeLayout.collapse()
}
} }
private fun findExpandableLayoutOf(button: CompoundButton): ExpandableRelativeLayout { private fun findExpandableLayoutOf(button: CompoundButton): ExpandableRelativeLayout {
@@ -223,29 +279,36 @@ class TimedTaskSettingActivity : BaseActivity() {
private fun showDisposableTaskTimePicker() { private fun showDisposableTaskTimePicker() {
val time = TIME_FORMATTER.parseLocalTime(mDisposableTaskTime.text.toString()) val time = TIME_FORMATTER.parseLocalTime(mDisposableTaskTime.text.toString())
TimePickerDialog(this, { _, hourOfDay, minute -> mDisposableTaskTime.text = TIME_FORMATTER.print(LocalTime(hourOfDay, minute)) }, time.hourOfDay, time.minuteOfHour, true) MaterialTimePickerDialog.newInstance(
.show() /* callback = */ { _, hourOfDay, minute, _ -> mDisposableTaskTime.text = TIME_FORMATTER.print(LocalTime(hourOfDay, minute)) },
/* hourOfDay = */ time.hourOfDay,
/* minute = */ time.minuteOfHour,
/* is24HourMode = */ true,
).apply {
version = MaterialTimePickerDialog.Version.VERSION_2
ThemeColorHelper.setThemeColorPrimary(this, this@TimedTaskSettingActivity, true)
isThemeDark = ViewUtils.isNightModeYes(this@TimedTaskSettingActivity)
}.show(supportFragmentManager, "TimedTaskTimePickerDialog")
} }
private fun showDisposableTaskDatePicker() { private fun showDisposableTaskDatePicker() {
val date = DATE_FORMATTER.parseLocalDate(mDisposableTaskDate.text.toString()) val date = DATE_FORMATTER.parseLocalDate(mDisposableTaskDate.text.toString())
DatePickerDialog( MaterialDatePickerDialog.newInstance(
this, /* callBack = */ { _, year, month, dayOfMonth -> mDisposableTaskDate.text = DATE_FORMATTER.print(LocalDate(year, month + 1, dayOfMonth)) },
{ _, year, month, dayOfMonth -> mDisposableTaskDate.text = DATE_FORMATTER.print(LocalDate(year, month + 1, dayOfMonth)) }, /* year = */ date.year,
date.year, /* monthOfYear = */ date.monthOfYear - 1,
date.monthOfYear - 1, /* dayOfMonth = */ date.dayOfMonth,
date.dayOfMonth ).apply {
).show() version = MaterialDatePickerDialog.Version.VERSION_2
ThemeColorHelper.setThemeColorPrimary(this, this@TimedTaskSettingActivity, true)
isThemeDark = ViewUtils.isNightModeYes(this@TimedTaskSettingActivity)
}.show(supportFragmentManager, "TimedTaskDatePickerDialog")
} }
private fun createTimedTask(): TimedTask? { private fun createTimedTask(): TimedTask? = when {
return if (mDisposableTaskRadio.isChecked) { mDisposableTaskRadio.isChecked -> createDisposableTask()
createDisposableTask() mDailyTaskRadio.isChecked -> createDailyTask()
} else if (mDailyTaskRadio.isChecked) { else -> createWeeklyTask()
createDailyTask()
} else {
createWeeklyTask()
}
} }
private fun createWeeklyTask(): TimedTask? { private fun createWeeklyTask(): TimedTask? {
@@ -260,12 +323,12 @@ class TimedTaskSettingActivity : BaseActivity() {
return null return null
} }
val time = LocalTime(mWeeklyTaskTimePicker.hour, mWeeklyTaskTimePicker.minute) val time = LocalTime(mWeeklyTaskTimePicker.hour, mWeeklyTaskTimePicker.minute)
return TimedTask.weeklyTask(time, timeFlag, mScriptFile!!.path, default) return TimedTask.weeklyTask(time, timeFlag, mScriptFile.path, default)
} }
private fun createDailyTask(): TimedTask { private fun createDailyTask(): TimedTask {
val time = LocalTime(mDailyTaskTimePicker.hour, mDailyTaskTimePicker.minute) val time = LocalTime(mDailyTaskTimePicker.hour, mDailyTaskTimePicker.minute)
return TimedTask.dailyTask(time, mScriptFile!!.path, ExecutionConfig()) return TimedTask.dailyTask(time, mScriptFile.path, ExecutionConfig())
} }
private fun createDisposableTask(): TimedTask? { private fun createDisposableTask(): TimedTask? {
@@ -279,11 +342,12 @@ class TimedTaskSettingActivity : BaseActivity() {
showToast(this, R.string.text_disposable_task_time_before_now) showToast(this, R.string.text_disposable_task_time_before_now)
return null return null
} }
return TimedTask.disposableTask(dateTime, mScriptFile!!.path, default) return TimedTask.disposableTask(dateTime, mScriptFile.path, default)
} }
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_timed_task_setting, menu) menuInflater.inflate(R.menu.menu_timed_task_setting, menu)
mToolbar.setMenuIconsColorByThemeColorLuminance(this)
return true return true
} }
@@ -291,17 +355,18 @@ class TimedTaskSettingActivity : BaseActivity() {
if (item.itemId == R.id.action_done) { if (item.itemId == R.id.action_done) {
if ((getSystemService(POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations(packageName)) { if ((getSystemService(POWER_SERVICE) as PowerManager).isIgnoringBatteryOptimizations(packageName)) {
createOrUpdateTask() createOrUpdateTask()
} else { return true
try { }
@SuppressLint("BatteryLife") val intent = Intent() try {
.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) @SuppressLint("BatteryLife")
.setData(Uri.parse("package:$packageName")) val intent = Intent()
@Suppress("DEPRECATION") .setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
startActivityForResult(intent, REQUEST_CODE_IGNORE_BATTERY) .setData("package:$packageName".toUri())
} catch (e: ActivityNotFoundException) { @Suppress("DEPRECATION")
e.printStackTrace() startActivityForResult(intent, REQUEST_CODE_IGNORE_BATTERY)
createOrUpdateTask() } catch (e: ActivityNotFoundException) {
} e.printStackTrace()
createOrUpdateTask()
} }
return true return true
} }
@@ -339,41 +404,46 @@ class TimedTaskSettingActivity : BaseActivity() {
private fun createOrUpdateIntentTask() { private fun createOrUpdateIntentTask() {
val buttonId = mBroadcastGroup.checkedRadioButtonId val buttonId = mBroadcastGroup.checkedRadioButtonId
if (buttonId == -1) { if (buttonId == -1) {
showToast(this, R.string.error_empty_broadcast_selection) showToast(this, R.string.error_empty_broadcast_selection, true)
return return
} }
val action: String? val actionString: String?
if (buttonId == R.id.run_on_other_broadcast) { if (buttonId == R.id.run_on_custom_broadcast) {
action = mOtherBroadcastAction.text.toString() actionString = mCustomBroadcastAction.text.toString()
if (action.isEmpty()) { if (actionString.isEmpty()) {
mOtherBroadcastAction.error = getString(R.string.text_should_not_be_empty) mCustomBroadcastAction.error = getString(R.string.text_should_not_be_empty)
return return
} }
} else { } else {
action = ACTIONS[buttonId] actionString = ACTIONS[buttonId]
} }
val task = IntentTask() val task = IntentTask().apply {
task.action = action action = actionString
task.scriptPath = mScriptFile!!.path scriptPath = mScriptFile.path
task.isLocal = action != null && action == DynamicBroadcastReceivers.ACTION_STARTUP isLocal = actionString == DynamicBroadcastReceivers.ACTION_STARTUP
if (mIntentTask != null) { }
task.id = mIntentTask!!.id when (val intentTask = mIntentTask) {
updateTask(task) null -> {
showToast(this, R.string.text_already_created) addTask(task)
} else { mTimedTask?.let { removeTask(it) }
addTask(task) }
if (mTimedTask != null) { else -> {
removeTask(mTimedTask!!) task.id = intentTask.id
updateTask(task)
} }
} }
showToast(this, R.string.text_already_created)
finish() finish()
} }
companion object { companion object {
const val EXTRA_INTENT_TASK_ID = "intent_task_id" const val EXTRA_INTENT_TASK_ID = "intent_task_id"
const val EXTRA_TASK_ID = TaskReceiver.EXTRA_TASK_ID const val EXTRA_TASK_ID = TaskReceiver.EXTRA_TASK_ID
private val TIME_FORMATTER = DateTimeFormat.forPattern("HH:mm") private val TIME_FORMATTER = DateTimeFormat.forPattern("HH:mm")
private val DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd") private val DATE_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd")
private const val REQUEST_CODE_IGNORE_BATTERY = 27101 private const val REQUEST_CODE_IGNORE_BATTERY = 27101
private const val LOG_TAG = "TimedTaskSettings" private const val LOG_TAG = "TimedTaskSettings"
@@ -415,6 +485,7 @@ class TimedTaskSettingActivity : BaseActivity() {
.put(R.id.run_on_config_change, Intent.ACTION_CONFIGURATION_CHANGED) .put(R.id.run_on_config_change, Intent.ACTION_CONFIGURATION_CHANGED)
.put(R.id.run_on_time_tick, Intent.ACTION_TIME_TICK) .put(R.id.run_on_time_tick, Intent.ACTION_TIME_TICK)
.build() .build()
} }
} }