Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
952010f
feat: #262 Ability to add custom DNS records
sameerasw Mar 23, 2026
c83124d
feat: #250 Time based scheduling and states in DIY
sameerasw Mar 23, 2026
cb49e3a
New translations strings.xml (Arabic)
sameerasw Mar 23, 2026
df0a0ca
New translations strings.xml (German)
sameerasw Mar 23, 2026
05fcd95
New translations strings.xml (Hebrew)
sameerasw Mar 23, 2026
c7287e1
New translations strings.xml (Italian)
sameerasw Mar 23, 2026
62a8cc4
New translations strings.xml (Japanese)
sameerasw Mar 23, 2026
5753bf4
New translations strings.xml (Polish)
sameerasw Mar 23, 2026
af92951
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
c4062db
New translations strings.xml (Portuguese, Brazilian)
sameerasw Mar 23, 2026
eed49b9
New translations strings.xml (English)
sameerasw Mar 23, 2026
7c09274
New translations strings.xml (Romanian)
sameerasw Mar 23, 2026
9af5b12
New translations strings.xml (French)
sameerasw Mar 23, 2026
24fc2e8
New translations strings.xml (Spanish)
sameerasw Mar 23, 2026
04ddf65
New translations strings.xml (Afrikaans)
sameerasw Mar 23, 2026
292665c
New translations strings.xml (Catalan)
sameerasw Mar 23, 2026
944c9b7
New translations strings.xml (Czech)
sameerasw Mar 23, 2026
6558ab6
New translations strings.xml (Danish)
sameerasw Mar 23, 2026
720281e
New translations strings.xml (Greek)
sameerasw Mar 23, 2026
1cc4574
New translations strings.xml (Finnish)
sameerasw Mar 23, 2026
b768e39
New translations strings.xml (Hungarian)
sameerasw Mar 23, 2026
07e2b25
New translations strings.xml (Korean)
sameerasw Mar 23, 2026
44df4a9
New translations strings.xml (Dutch)
sameerasw Mar 23, 2026
1cf98cb
New translations strings.xml (Norwegian)
sameerasw Mar 23, 2026
9650a1d
New translations strings.xml (Portuguese)
sameerasw Mar 23, 2026
27e70b5
New translations strings.xml (Serbian (Cyrillic))
sameerasw Mar 23, 2026
22124df
New translations strings.xml (Swedish)
sameerasw Mar 23, 2026
0da8857
New translations strings.xml (Turkish)
sameerasw Mar 23, 2026
5140b3b
New translations strings.xml (Ukrainian)
sameerasw Mar 23, 2026
a85c3d6
New translations strings.xml (Chinese Simplified)
sameerasw Mar 23, 2026
289e4fc
New translations strings.xml (Chinese Traditional)
sameerasw Mar 23, 2026
737fb4b
New translations strings.xml (Vietnamese)
sameerasw Mar 23, 2026
c3089de
New translations strings.xml (Sinhala)
sameerasw Mar 23, 2026
ee54ef7
New translations strings.xml (Acholi)
sameerasw Mar 23, 2026
d92cdc6
feat: #250 Low power mode DIY
sameerasw Mar 23, 2026
9759939
Update source file strings.xml
sameerasw Mar 23, 2026
b3dedae
New translations strings.xml (Arabic)
sameerasw Mar 23, 2026
25933e3
New translations strings.xml (German)
sameerasw Mar 23, 2026
4ec7362
New translations strings.xml (Hebrew)
sameerasw Mar 23, 2026
dfdd87e
New translations strings.xml (Italian)
sameerasw Mar 23, 2026
28f5ee8
New translations strings.xml (Japanese)
sameerasw Mar 23, 2026
401a5a6
New translations strings.xml (Polish)
sameerasw Mar 23, 2026
b850fd9
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
2109ea8
New translations strings.xml (Portuguese, Brazilian)
sameerasw Mar 23, 2026
7b6fcc1
New translations strings.xml (English)
sameerasw Mar 23, 2026
a9a1a22
New translations strings.xml (Romanian)
sameerasw Mar 23, 2026
6b28d83
New translations strings.xml (French)
sameerasw Mar 23, 2026
738f920
New translations strings.xml (Spanish)
sameerasw Mar 23, 2026
96274cf
New translations strings.xml (Afrikaans)
sameerasw Mar 23, 2026
fda15d6
New translations strings.xml (Catalan)
sameerasw Mar 23, 2026
445d730
New translations strings.xml (Czech)
sameerasw Mar 23, 2026
6638d49
New translations strings.xml (Danish)
sameerasw Mar 23, 2026
cc4e8b1
New translations strings.xml (Greek)
sameerasw Mar 23, 2026
5a38aa9
New translations strings.xml (Finnish)
sameerasw Mar 23, 2026
596df1d
New translations strings.xml (Hungarian)
sameerasw Mar 23, 2026
65ff917
New translations strings.xml (Korean)
sameerasw Mar 23, 2026
3c72379
New translations strings.xml (Dutch)
sameerasw Mar 23, 2026
e0835b2
New translations strings.xml (Norwegian)
sameerasw Mar 23, 2026
f7431fb
New translations strings.xml (Portuguese)
sameerasw Mar 23, 2026
a263860
New translations strings.xml (Serbian (Cyrillic))
sameerasw Mar 23, 2026
e4a21f1
New translations strings.xml (Swedish)
sameerasw Mar 23, 2026
3356bed
New translations strings.xml (Turkish)
sameerasw Mar 23, 2026
f7be70d
New translations strings.xml (Ukrainian)
sameerasw Mar 23, 2026
ed02594
New translations strings.xml (Chinese Simplified)
sameerasw Mar 23, 2026
887cd21
New translations strings.xml (Chinese Traditional)
sameerasw Mar 23, 2026
3a81ea2
New translations strings.xml (Vietnamese)
sameerasw Mar 23, 2026
d9622e5
New translations strings.xml (Sinhala)
sameerasw Mar 23, 2026
8f7d752
New translations strings.xml (Acholi)
sameerasw Mar 23, 2026
f5da97c
feat: #251 Accented characters in keyboard
sameerasw Mar 23, 2026
4e4e71c
Update source file strings.xml
sameerasw Mar 23, 2026
74aab50
New translations strings.xml (Arabic)
sameerasw Mar 23, 2026
6d2b9f4
New translations strings.xml (German)
sameerasw Mar 23, 2026
7dd8b1f
New translations strings.xml (Hebrew)
sameerasw Mar 23, 2026
97ee85f
New translations strings.xml (Italian)
sameerasw Mar 23, 2026
0c5650f
New translations strings.xml (Japanese)
sameerasw Mar 23, 2026
cb196ac
New translations strings.xml (Polish)
sameerasw Mar 23, 2026
74ce56f
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
61d0055
New translations strings.xml (Portuguese, Brazilian)
sameerasw Mar 23, 2026
9342801
New translations strings.xml (English)
sameerasw Mar 23, 2026
2f47b80
New translations strings.xml (Romanian)
sameerasw Mar 23, 2026
622cd74
New translations strings.xml (French)
sameerasw Mar 23, 2026
95b0d2a
New translations strings.xml (Spanish)
sameerasw Mar 23, 2026
301284b
New translations strings.xml (Afrikaans)
sameerasw Mar 23, 2026
2483d48
New translations strings.xml (Catalan)
sameerasw Mar 23, 2026
73f3b34
New translations strings.xml (Czech)
sameerasw Mar 23, 2026
4955f50
New translations strings.xml (Danish)
sameerasw Mar 23, 2026
f809dce
New translations strings.xml (Greek)
sameerasw Mar 23, 2026
6acf1d0
New translations strings.xml (Finnish)
sameerasw Mar 23, 2026
0e32f32
New translations strings.xml (Hungarian)
sameerasw Mar 23, 2026
ae1a124
New translations strings.xml (Korean)
sameerasw Mar 23, 2026
d6c8ff2
New translations strings.xml (Dutch)
sameerasw Mar 23, 2026
857f892
New translations strings.xml (Norwegian)
sameerasw Mar 23, 2026
dee884b
New translations strings.xml (Portuguese)
sameerasw Mar 23, 2026
b1014f0
New translations strings.xml (Serbian (Cyrillic))
sameerasw Mar 23, 2026
7f59b37
New translations strings.xml (Swedish)
sameerasw Mar 23, 2026
849bc47
New translations strings.xml (Turkish)
sameerasw Mar 23, 2026
288b423
New translations strings.xml (Ukrainian)
sameerasw Mar 23, 2026
5dcf3f0
New translations strings.xml (Chinese Simplified)
sameerasw Mar 23, 2026
230ca19
New translations strings.xml (Chinese Traditional)
sameerasw Mar 23, 2026
0d43db3
New translations strings.xml (Vietnamese)
sameerasw Mar 23, 2026
c8baa5e
New translations strings.xml (Sinhala)
sameerasw Mar 23, 2026
4374b22
New translations strings.xml (Acholi)
sameerasw Mar 23, 2026
426ae83
feat: #245 App suspension
sameerasw Mar 23, 2026
abeadd0
feat: #245 unpause app button when suspended
sameerasw Mar 23, 2026
4d5bbcc
fix: #266 device model matchign for gsmarena
sameerasw Mar 23, 2026
9a4dda1
feat: Cache device specs
sameerasw Mar 23, 2026
2e4ff53
Update source file strings.xml
sameerasw Mar 23, 2026
acb1e58
New translations strings.xml (Arabic)
sameerasw Mar 23, 2026
b2b3cbd
New translations strings.xml (Romanian)
sameerasw Mar 23, 2026
8fe0285
New translations strings.xml (French)
sameerasw Mar 23, 2026
cba66d6
New translations strings.xml (Spanish)
sameerasw Mar 23, 2026
df77901
New translations strings.xml (Afrikaans)
sameerasw Mar 23, 2026
84fbd2b
New translations strings.xml (Catalan)
sameerasw Mar 23, 2026
f8d881d
New translations strings.xml (German)
sameerasw Mar 23, 2026
eecfd47
New translations strings.xml (Hebrew)
sameerasw Mar 23, 2026
121a9f9
New translations strings.xml (Italian)
sameerasw Mar 23, 2026
bccffcd
New translations strings.xml (Japanese)
sameerasw Mar 23, 2026
3a51d64
New translations strings.xml (Polish)
sameerasw Mar 23, 2026
3fc53b8
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
4e6c349
New translations strings.xml (Portuguese, Brazilian)
sameerasw Mar 23, 2026
755d650
New translations strings.xml (English)
sameerasw Mar 23, 2026
d2707d2
New translations strings.xml (Czech)
sameerasw Mar 23, 2026
ee54de9
New translations strings.xml (Danish)
sameerasw Mar 23, 2026
ecd8fa4
New translations strings.xml (Greek)
sameerasw Mar 23, 2026
2389337
New translations strings.xml (Finnish)
sameerasw Mar 23, 2026
f4f4f31
New translations strings.xml (Hungarian)
sameerasw Mar 23, 2026
08fbfad
New translations strings.xml (Korean)
sameerasw Mar 23, 2026
9aab1d0
New translations strings.xml (Dutch)
sameerasw Mar 23, 2026
9a49f6e
New translations strings.xml (Norwegian)
sameerasw Mar 23, 2026
392d16e
New translations strings.xml (Portuguese)
sameerasw Mar 23, 2026
3873dcb
New translations strings.xml (Serbian (Cyrillic))
sameerasw Mar 23, 2026
925e171
New translations strings.xml (Swedish)
sameerasw Mar 23, 2026
0653c43
New translations strings.xml (Turkish)
sameerasw Mar 23, 2026
1a10514
New translations strings.xml (Ukrainian)
sameerasw Mar 23, 2026
d4645ee
New translations strings.xml (Chinese Simplified)
sameerasw Mar 23, 2026
20824ec
New translations strings.xml (Chinese Traditional)
sameerasw Mar 23, 2026
233d3f6
New translations strings.xml (Vietnamese)
sameerasw Mar 23, 2026
693bb41
New translations strings.xml (Sinhala)
sameerasw Mar 23, 2026
cbeb2fe
New translations strings.xml (Acholi)
sameerasw Mar 23, 2026
e306a46
feat: Updated app icon with flat bg
sameerasw Mar 23, 2026
7ce6675
chore: Updated toolchain daemon
sameerasw Mar 23, 2026
318656e
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
fb11d0e
New translations strings.xml (Russian)
sameerasw Mar 23, 2026
824e2f2
New translations strings.xml (Russian)
sameerasw Mar 24, 2026
40fd9a7
New translations strings.xml (Russian)
sameerasw Mar 24, 2026
c043f03
New translations strings.xml (Russian)
sameerasw Mar 24, 2026
db1930f
Merge branch 'develop' into l10n_develop
sameerasw Mar 24, 2026
fd21037
New Crowdin updates (#291)
sameerasw Mar 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" />
<uses-feature android:name="android.hardware.camera.flashlight" android:required="false" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />

<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<uses-permission android:name="android.permission.VIBRATE" />
Expand Down Expand Up @@ -695,6 +697,14 @@
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

<receiver
android:name=".services.automation.receivers.TimeAutomationReceiver"
android:exported="false">
<intent-filter>
<action android:name="com.sameerasw.essentials.ACTION_TIME_AUTOMATION_TRIGGER" />
</intent-filter>
</receiver>


<service
Expand Down
Binary file modified app/src/main/ic_launcher-playstore.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@ data class DeviceSpecCategory(
data class DeviceSpecs(
val deviceName: String,
val detailSpec: List<DeviceSpecCategory>,
val imageUrls: List<String> = emptyList()
val imageUrls: List<String> = emptyList(),
val localImagePaths: List<String> = emptyList(),
val lastUpdated: Long = System.currentTimeMillis()
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.sameerasw.essentials.domain.model.AppSelection
import com.sameerasw.essentials.domain.model.NotificationLightingColorMode
import com.sameerasw.essentials.domain.model.NotificationLightingSide
import com.sameerasw.essentials.domain.model.NotificationLightingStyle
import com.sameerasw.essentials.domain.model.DnsPreset
import com.sameerasw.essentials.domain.model.TrackedRepo
import com.sameerasw.essentials.domain.model.github.GitHubUser
import com.sameerasw.essentials.utils.RootUtils
Expand Down Expand Up @@ -100,6 +101,7 @@ class SettingsRepository(private val context: Context) {
const val KEY_FREEZE_AUTO_EXCLUDED_APPS = "freeze_auto_excluded_apps"
const val KEY_FREEZE_SELECTED_APPS = "freeze_selected_apps"
const val KEY_FREEZE_DONT_FREEZE_ACTIVE_APPS = "freeze_dont_freeze_active_apps"
const val KEY_FREEZE_MODE = "freeze_mode"

const val KEY_DEVELOPER_MODE_ENABLED = "developer_mode_enabled"
const val KEY_HAPTIC_FEEDBACK_TYPE = "haptic_feedback_type"
Expand All @@ -120,6 +122,7 @@ class SettingsRepository(private val context: Context) {
const val KEY_KEYBOARD_PITCH_BLACK = "keyboard_pitch_black"
const val KEY_KEYBOARD_CLIPBOARD_ENABLED = "keyboard_clipboard_enabled"
const val KEY_KEYBOARD_LONG_PRESS_SYMBOLS = "keyboard_long_press_symbols"
const val KEY_KEYBOARD_ACCENTED_CHARACTERS = "keyboard_accented_characters"

// Essentials-AirSync Bridge
const val KEY_AIRSYNC_CONNECTION_ENABLED = "airsync_connection_enabled"
Expand Down Expand Up @@ -166,6 +169,7 @@ class SettingsRepository(private val context: Context) {
const val KEY_USE_BLUR = "use_blur"
const val KEY_SENTRY_REPORT_MODE = "sentry_report_mode"
const val KEY_ONBOARDING_COMPLETED = "onboarding_completed"
const val KEY_PRIVATE_DNS_PRESETS = "private_dns_presets"
}

// Observe changes
Expand Down Expand Up @@ -285,6 +289,8 @@ class SettingsRepository(private val context: Context) {
putString(KEY_FREEZE_AUTO_EXCLUDED_APPS, json)
}

fun getFreezeMode(): Int = getInt(KEY_FREEZE_MODE, 0)

fun getHapticFeedbackType(): HapticFeedbackType {
val typeName = prefs.getString(KEY_HAPTIC_FEEDBACK_TYPE, HapticFeedbackType.SUBTLE.name)
return try {
Expand Down Expand Up @@ -717,6 +723,9 @@ class SettingsRepository(private val context: Context) {
fun isUserDictionaryEnabled(): Boolean = getBoolean(KEY_USER_DICTIONARY_ENABLED, false)
fun setUserDictionaryEnabled(enabled: Boolean) = putBoolean(KEY_USER_DICTIONARY_ENABLED, enabled)

fun isAccentedCharactersEnabled(): Boolean = getBoolean(KEY_KEYBOARD_ACCENTED_CHARACTERS, false)
fun setAccentedCharactersEnabled(enabled: Boolean) = putBoolean(KEY_KEYBOARD_ACCENTED_CHARACTERS, enabled)

fun isBatteryNotificationEnabled(): Boolean = getBoolean(KEY_BATTERY_NOTIFICATION_ENABLED, false)
fun setBatteryNotificationEnabled(enabled: Boolean) = putBoolean(KEY_BATTERY_NOTIFICATION_ENABLED, enabled)

Expand Down Expand Up @@ -866,5 +875,37 @@ class SettingsRepository(private val context: Context) {
e.printStackTrace()
}
}

fun getPrivateDnsPresets(): List<DnsPreset> {
val json = prefs.getString(KEY_PRIVATE_DNS_PRESETS, null)
return if (json != null) {
try {
gson.fromJson(json, Array<DnsPreset>::class.java).toList()
} catch (e: Exception) {
getDefaultDnsPresets()
}
} else {
getDefaultDnsPresets().also { savePrivateDnsPresets(it) }
}
}

private fun getDefaultDnsPresets(): List<DnsPreset> {
return listOf(
DnsPreset(name = context.getString(com.sameerasw.essentials.R.string.dns_preset_adguard), hostname = "dns.adguard.com", isDefault = true),
DnsPreset(name = context.getString(com.sameerasw.essentials.R.string.dns_preset_google), hostname = "dns.google", isDefault = true),
DnsPreset(name = context.getString(com.sameerasw.essentials.R.string.dns_preset_cloudflare), hostname = "1dot1dot1dot1.cloudflare-dns.com", isDefault = true),
DnsPreset(name = context.getString(com.sameerasw.essentials.R.string.dns_preset_quad9), hostname = "dns.quad9.net", isDefault = true),
DnsPreset(name = context.getString(com.sameerasw.essentials.R.string.dns_preset_cleanbrowsing), hostname = "adult-filter-dns.cleanbrowsing.org", isDefault = true)
)
}

fun savePrivateDnsPresets(presets: List<DnsPreset>) {
val json = gson.toJson(presets)
putString(KEY_PRIVATE_DNS_PRESETS, json)
}

fun resetPrivateDnsPresets() {
savePrivateDnsPresets(getDefaultDnsPresets())
}
}

10 changes: 10 additions & 0 deletions app/src/main/java/com/sameerasw/essentials/domain/diy/Action.kt
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,14 @@ sealed interface Action {
override val permissions: List<String> = listOf("notification_policy")
override val isConfigurable: Boolean = true
}

data object TurnOnLowPower : Action {
override val title: Int = R.string.diy_action_low_power_on
override val icon: Int = R.drawable.rounded_battery_android_frame_shield_24
}

data object TurnOffLowPower : Action {
override val title: Int = R.string.diy_action_low_power_off
override val icon: Int = R.drawable.rounded_battery_android_frame_shield_24
}
}
11 changes: 11 additions & 0 deletions app/src/main/java/com/sameerasw/essentials/domain/diy/State.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,15 @@ sealed interface State {
override val title: Int = R.string.diy_state_screen_on
override val icon: Int = R.drawable.rounded_mobile_text_2_24
}

data class TimePeriod(
val startHour: Int = 0,
val startMinute: Int = 0,
val endHour: Int = 0,
val endMinute: Int = 0,
val days: Set<Int> = emptySet()
) : State {
override val title: Int = R.string.diy_state_time_period
override val icon: Int = R.drawable.rounded_timelapse_24
}
}
10 changes: 10 additions & 0 deletions app/src/main/java/com/sameerasw/essentials/domain/diy/Trigger.kt
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,14 @@ sealed interface Trigger {
override val title: Int = R.string.diy_trigger_charger_disconnected
override val icon: Int = R.drawable.rounded_battery_android_frame_3_24
}

data class Schedule(
val hour: Int = 0,
val minute: Int = 0,
val days: Set<Int> = emptySet()
) : Trigger {
override val title: Int = R.string.diy_trigger_schedule
override val icon: Int = R.drawable.rounded_nest_clock_farsight_analog_24
override val isConfigurable: Boolean = true
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.sameerasw.essentials.domain.model

data class DnsPreset(
val id: String = java.util.UUID.randomUUID().toString(),
val name: String,
val hostname: String,
val isDefault: Boolean = false
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.sameerasw.essentials.domain.model

enum class FreezeMode(val value: Int) {
FREEZE(0),
SUSPEND(1);

companion object {
fun fromInt(value: Int) = entries.find { it.value == value } ?: FREEZE
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,15 @@ class EssentialsInputMethodService : InputMethodService(), LifecycleOwner, ViewM
)
}

var isAccentedCharactersEnabled by remember {
mutableStateOf(
prefs.getBoolean(
SettingsRepository.KEY_KEYBOARD_ACCENTED_CHARACTERS,
false
)
)
}

// Observe SharedPreferences changes
DisposableEffect(prefs) {
val listener =
Expand Down Expand Up @@ -377,6 +386,12 @@ class EssentialsInputMethodService : InputMethodService(), LifecycleOwner, ViewM
false
)
}
SettingsRepository.KEY_KEYBOARD_ACCENTED_CHARACTERS -> {
isAccentedCharactersEnabled = sharedPreferences.getBoolean(
SettingsRepository.KEY_KEYBOARD_ACCENTED_CHARACTERS,
false
)
}
}
}
prefs.registerOnSharedPreferenceChangeListener(listener)
Expand Down Expand Up @@ -404,6 +419,7 @@ class EssentialsInputMethodService : InputMethodService(), LifecycleOwner, ViewM
functionsPadding = functionsPadding.dp,
isClipboardEnabled = isKeyboardClipboardEnabled,
isLongPressSymbolsEnabled = isLongPressSymbolsEnabled,
isAccentedCharactersEnabled = isAccentedCharactersEnabled,
suggestions = suggestions,
clipboardHistory = _clipboardHistory.collectAsState().value,
onOpened = resetTrigger,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.sameerasw.essentials.domain.diy.Trigger
import com.sameerasw.essentials.services.automation.modules.AutomationModule
import com.sameerasw.essentials.services.automation.modules.DisplayModule
import com.sameerasw.essentials.services.automation.modules.PowerModule
import com.sameerasw.essentials.services.automation.modules.TimeModule
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -61,6 +62,7 @@ object AutomationManager {
val requiredModuleIds = mutableSetOf<String>()
val powerAutomations = mutableListOf<Automation>()
val displayAutomations = mutableListOf<Automation>()
val timeAutomations = mutableListOf<Automation>()

enabledAutomations.forEach { automation ->
when (automation.type) {
Expand All @@ -76,6 +78,11 @@ object AutomationManager {
displayAutomations.add(automation)
}

is Trigger.Schedule -> {
requiredModuleIds.add(TimeModule.ID)
timeAutomations.add(automation)
}

else -> {}
}
}
Expand All @@ -92,6 +99,11 @@ object AutomationManager {
displayAutomations.add(automation)
}

is DIYState.TimePeriod -> {
requiredModuleIds.add(TimeModule.ID)
timeAutomations.add(automation)
}

else -> {}
}
}
Expand Down Expand Up @@ -132,6 +144,16 @@ object AutomationManager {
} else {
activeModules.remove(DisplayModule.ID)?.stop(context)
}

// Time Module
if (requiredModuleIds.contains(TimeModule.ID)) {
val module = activeModules.getOrPut(TimeModule.ID) {
TimeModule().also { it.start(context) }
}
module.updateAutomations(timeAutomations)
} else {
activeModules.remove(TimeModule.ID)?.stop(context)
}
}

private fun startService(context: Context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ import com.sameerasw.essentials.domain.diy.Action

object CombinedActionExecutor {

suspend fun execute(context: Context, action: Action) {
when (action) {
suspend fun execute(context: Context, action: com.sameerasw.essentials.domain.diy.Action) {
kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.Main) {
when (action) {
is Action.TurnOnLowPower -> setLowPowerMode(context, true)
is Action.TurnOffLowPower -> setLowPowerMode(context, false)
is Action.HapticVibration -> {
val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
val manager =
Expand Down Expand Up @@ -90,7 +93,7 @@ object CombinedActionExecutor {
} catch (refE: Exception) {
null
}
} ?: return
} ?: return@withContext

effectsBuilder.setShouldDisplayGrayscale(action.grayscale)
.setShouldSuppressAmbientDisplay(action.suppressAmbient)
Expand Down Expand Up @@ -189,6 +192,7 @@ object CombinedActionExecutor {
e.printStackTrace()
}
}
}
}
}

Expand All @@ -201,4 +205,13 @@ object CombinedActionExecutor {
e.printStackTrace()
}
}

private fun setLowPowerMode(context: Context, on: Boolean) {
val value = if (on) 1 else 0
try {
android.provider.Settings.Global.putInt(context.contentResolver, "low_power", value)
} catch (e: Exception) {
e.printStackTrace()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.PowerManager
import com.sameerasw.essentials.domain.diy.Automation
import com.sameerasw.essentials.domain.diy.Trigger
import com.sameerasw.essentials.services.automation.executors.CombinedActionExecutor
Expand Down
Loading