Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
262 commits
Select commit Hold shift + click to select a range
bc6c4a3
New translations strings.xml (Russian)
sameerasw Jan 17, 2026
5ca3af3
App automations
sameerasw Jan 17, 2026
aaaf813
New translations strings.xml (Russian)
sameerasw Jan 17, 2026
7aad5df
Device effects action and expressive sheets for edit diy
sameerasw Jan 17, 2026
d922872
Revert "fix: harmonize warning color in battery widget"
sameerasw Jan 17, 2026
85755cc
minor fix
sameerasw Jan 17, 2026
60a9633
Update widget background
sameerasw Jan 17, 2026
6816a1b
Attempted fix for #106 root permission spam
sameerasw Jan 17, 2026
a1bb4f3
Update source file strings.xml
sameerasw Jan 17, 2026
a4fac47
New translations strings.xml (Romanian)
sameerasw Jan 17, 2026
2747443
New translations strings.xml (French)
sameerasw Jan 17, 2026
aa1cace
New translations strings.xml (Spanish)
sameerasw Jan 17, 2026
3265f8a
New translations strings.xml (Afrikaans)
sameerasw Jan 17, 2026
d3e47b6
New translations strings.xml (Arabic)
sameerasw Jan 17, 2026
352099e
New translations strings.xml (Catalan)
sameerasw Jan 17, 2026
8ca6a53
New translations strings.xml (Czech)
sameerasw Jan 17, 2026
4a754e1
New translations strings.xml (Danish)
sameerasw Jan 17, 2026
e82ed92
New translations strings.xml (German)
sameerasw Jan 17, 2026
ff6403a
New translations strings.xml (Greek)
sameerasw Jan 17, 2026
69166aa
New translations strings.xml (Finnish)
sameerasw Jan 17, 2026
429dba0
New translations strings.xml (Hebrew)
sameerasw Jan 17, 2026
1702e1f
New translations strings.xml (Hungarian)
sameerasw Jan 17, 2026
8037d1a
New translations strings.xml (Italian)
sameerasw Jan 17, 2026
861745b
New translations strings.xml (Japanese)
sameerasw Jan 17, 2026
596f07f
New translations strings.xml (Korean)
sameerasw Jan 17, 2026
bcd3fd4
New translations strings.xml (Dutch)
sameerasw Jan 17, 2026
5db9cf1
New translations strings.xml (Norwegian)
sameerasw Jan 17, 2026
df50f04
New translations strings.xml (Polish)
sameerasw Jan 17, 2026
3a48020
New translations strings.xml (Portuguese)
sameerasw Jan 17, 2026
55ac58d
New translations strings.xml (Russian)
sameerasw Jan 17, 2026
29c7704
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 17, 2026
300e74c
New translations strings.xml (Swedish)
sameerasw Jan 17, 2026
1c96949
New translations strings.xml (Turkish)
sameerasw Jan 17, 2026
914acf3
New translations strings.xml (Ukrainian)
sameerasw Jan 17, 2026
5a35dab
New translations strings.xml (Chinese Simplified)
sameerasw Jan 17, 2026
b9786a6
New translations strings.xml (Chinese Traditional)
sameerasw Jan 17, 2026
aecd166
New translations strings.xml (English)
sameerasw Jan 17, 2026
7949d70
New translations strings.xml (Vietnamese)
sameerasw Jan 17, 2026
974c763
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 17, 2026
ee01e87
New translations strings.xml (Sinhala)
sameerasw Jan 17, 2026
fd28f93
New translations strings.xml (Acholi)
sameerasw Jan 17, 2026
78b9a11
New translations strings.xml (French)
sameerasw Jan 18, 2026
175dabd
New translations strings.xml (French)
sameerasw Jan 18, 2026
6235961
New translations strings.xml (Arabic)
sameerasw Jan 18, 2026
d31b6c9
New translations strings.xml (Arabic)
sameerasw Jan 18, 2026
9830156
New translations strings.xml (Japanese)
sameerasw Jan 18, 2026
1afb133
New translations strings.xml (French)
sameerasw Jan 18, 2026
3a3e05f
New translations strings.xml (French)
sameerasw Jan 18, 2026
9937808
New translations strings.xml (French)
sameerasw Jan 18, 2026
6b76d9a
New translations strings.xml (French)
sameerasw Jan 18, 2026
296d8e0
New translations strings.xml (Romanian)
sameerasw Jan 19, 2026
c60e63e
New translations strings.xml (Japanese)
sameerasw Jan 19, 2026
074a4a5
New translations strings.xml (German)
sameerasw Jan 21, 2026
2c32786
New translations strings.xml (German)
sameerasw Jan 21, 2026
73fa80b
Fix #128 Realme service crash issue
sameerasw Jan 22, 2026
912feec
Merge pull request #118 from sameerasw/l10n_develop
sameerasw Jan 22, 2026
66146d4
Fix #136 lcoation tracking crash
sameerasw Jan 22, 2026
12237b1
Fix #107 Only use shizuku while display is off
sameerasw Jan 22, 2026
00d0633
#46 Sound mode button remap
sameerasw Jan 22, 2026
91d5154
#46 Toggle media volume for button remap
sameerasw Jan 22, 2026
3cdc37a
Update source file strings.xml
sameerasw Jan 22, 2026
2b45c68
New translations strings.xml (Romanian)
sameerasw Jan 22, 2026
2b94c3d
New translations strings.xml (French)
sameerasw Jan 22, 2026
5577c42
New translations strings.xml (Spanish)
sameerasw Jan 22, 2026
0969c66
New translations strings.xml (Afrikaans)
sameerasw Jan 22, 2026
e9c850a
New translations strings.xml (Arabic)
sameerasw Jan 22, 2026
1de3213
New translations strings.xml (Catalan)
sameerasw Jan 22, 2026
db2696d
New translations strings.xml (Czech)
sameerasw Jan 22, 2026
3eccfb8
New translations strings.xml (Danish)
sameerasw Jan 22, 2026
5c5e93d
New translations strings.xml (German)
sameerasw Jan 22, 2026
7529446
New translations strings.xml (Greek)
sameerasw Jan 22, 2026
a07d37a
New translations strings.xml (Finnish)
sameerasw Jan 22, 2026
db2afac
New translations strings.xml (Hebrew)
sameerasw Jan 22, 2026
2335a69
New translations strings.xml (Hungarian)
sameerasw Jan 22, 2026
8b5e407
New translations strings.xml (Italian)
sameerasw Jan 22, 2026
1942c38
New translations strings.xml (Japanese)
sameerasw Jan 22, 2026
7e5b114
New translations strings.xml (Korean)
sameerasw Jan 22, 2026
11c0daf
New translations strings.xml (Dutch)
sameerasw Jan 22, 2026
f7e66c6
New translations strings.xml (Norwegian)
sameerasw Jan 22, 2026
c2c00be
New translations strings.xml (Polish)
sameerasw Jan 22, 2026
5113068
New translations strings.xml (Portuguese)
sameerasw Jan 22, 2026
7d8dd9a
New translations strings.xml (Russian)
sameerasw Jan 22, 2026
5fb5b58
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 22, 2026
cadf539
New translations strings.xml (Swedish)
sameerasw Jan 22, 2026
fe4aeab
New translations strings.xml (Turkish)
sameerasw Jan 22, 2026
5478249
New translations strings.xml (Ukrainian)
sameerasw Jan 22, 2026
9b1f578
New translations strings.xml (Chinese Simplified)
sameerasw Jan 22, 2026
66f3fee
New translations strings.xml (Chinese Traditional)
sameerasw Jan 22, 2026
41dc2eb
New translations strings.xml (English)
sameerasw Jan 22, 2026
7e979ca
New translations strings.xml (Vietnamese)
sameerasw Jan 22, 2026
4896a88
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 22, 2026
98bb5cf
New translations strings.xml (Sinhala)
sameerasw Jan 22, 2026
84391ed
New translations strings.xml (Acholi)
sameerasw Jan 22, 2026
dd169b1
Update source file strings.xml
sameerasw Jan 22, 2026
73e8291
Fix #145 System notification detection is no longer language specific
sameerasw Jan 22, 2026
8d40376
New translations strings.xml (Romanian)
sameerasw Jan 22, 2026
1603f3f
New translations strings.xml (French)
sameerasw Jan 22, 2026
448af85
New translations strings.xml (Spanish)
sameerasw Jan 22, 2026
c2faf0f
New translations strings.xml (Afrikaans)
sameerasw Jan 22, 2026
8dc25e4
New translations strings.xml (Arabic)
sameerasw Jan 22, 2026
e33a445
New translations strings.xml (Catalan)
sameerasw Jan 22, 2026
a3e2890
New translations strings.xml (Czech)
sameerasw Jan 22, 2026
7866bfb
New translations strings.xml (Danish)
sameerasw Jan 22, 2026
a19ede6
New translations strings.xml (German)
sameerasw Jan 22, 2026
b5de072
New translations strings.xml (Greek)
sameerasw Jan 22, 2026
5fb6974
New translations strings.xml (Finnish)
sameerasw Jan 22, 2026
e410412
New translations strings.xml (Hebrew)
sameerasw Jan 22, 2026
e4ea9e8
New translations strings.xml (Hungarian)
sameerasw Jan 22, 2026
2093217
New translations strings.xml (Italian)
sameerasw Jan 22, 2026
5b4833b
New translations strings.xml (Japanese)
sameerasw Jan 22, 2026
ba32d8f
New translations strings.xml (Korean)
sameerasw Jan 22, 2026
36e0405
New translations strings.xml (Dutch)
sameerasw Jan 22, 2026
7d4add6
New translations strings.xml (Norwegian)
sameerasw Jan 22, 2026
2dddffc
New translations strings.xml (Polish)
sameerasw Jan 22, 2026
2d5ad53
New translations strings.xml (Portuguese)
sameerasw Jan 22, 2026
2571ee7
New translations strings.xml (Russian)
sameerasw Jan 22, 2026
f89a1d2
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 22, 2026
d6b85ce
New translations strings.xml (Swedish)
sameerasw Jan 22, 2026
9f6ded9
New translations strings.xml (Turkish)
sameerasw Jan 22, 2026
686ce17
New translations strings.xml (Ukrainian)
sameerasw Jan 22, 2026
decd94f
New translations strings.xml (Chinese Simplified)
sameerasw Jan 22, 2026
92ccca0
New translations strings.xml (Chinese Traditional)
sameerasw Jan 22, 2026
2c1e613
New translations strings.xml (English)
sameerasw Jan 22, 2026
a7865de
New translations strings.xml (Vietnamese)
sameerasw Jan 22, 2026
66de9a1
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 22, 2026
577e019
New translations strings.xml (Sinhala)
sameerasw Jan 22, 2026
bca15de
New translations strings.xml (Acholi)
sameerasw Jan 22, 2026
cdd6fde
Update source file strings.xml
sameerasw Jan 22, 2026
e235816
Merge pull request #146 from sameerasw/l10n_develop
sameerasw Jan 23, 2026
550f92d
Fix search with system notification snoozing changes
sameerasw Jan 23, 2026
cd17d33
Fix write secure settings incorrect check
sameerasw Jan 23, 2026
862a120
Fix #26 a workaround for the lack of accessibility overlay on unsuppo…
sameerasw Jan 23, 2026
0a738d6
Fix edge lighting on Android 11 #26
sameerasw Jan 23, 2026
a099ee9
Improve #97 System app badges
sameerasw Jan 23, 2026
f8434e6
#26 flashlight pulse support for older devices
sameerasw Jan 23, 2026
e8cd2d8
#75 Private DNS QS tile
sameerasw Jan 23, 2026
409aaec
#75 USB debugging QS tile
sameerasw Jan 23, 2026
a1fb4d3
New translations strings.xml (Romanian)
sameerasw Jan 23, 2026
85957e4
New translations strings.xml (French)
sameerasw Jan 23, 2026
9c19963
New translations strings.xml (Spanish)
sameerasw Jan 23, 2026
27882fa
New translations strings.xml (Afrikaans)
sameerasw Jan 23, 2026
45f49c8
New translations strings.xml (Arabic)
sameerasw Jan 23, 2026
01f8e52
New translations strings.xml (Catalan)
sameerasw Jan 23, 2026
09511b4
New translations strings.xml (Czech)
sameerasw Jan 23, 2026
d541704
New translations strings.xml (Danish)
sameerasw Jan 23, 2026
3ef19ef
New translations strings.xml (German)
sameerasw Jan 23, 2026
818e9a1
New translations strings.xml (Greek)
sameerasw Jan 23, 2026
db46c9f
New translations strings.xml (Finnish)
sameerasw Jan 23, 2026
942de6b
New translations strings.xml (Hebrew)
sameerasw Jan 23, 2026
acd2d9c
New translations strings.xml (Hungarian)
sameerasw Jan 23, 2026
73e47f7
New translations strings.xml (Italian)
sameerasw Jan 23, 2026
59fe11b
New translations strings.xml (Japanese)
sameerasw Jan 23, 2026
90ee808
New translations strings.xml (Korean)
sameerasw Jan 23, 2026
83d4d74
New translations strings.xml (Dutch)
sameerasw Jan 23, 2026
04abc44
New translations strings.xml (Norwegian)
sameerasw Jan 23, 2026
c499757
New translations strings.xml (Polish)
sameerasw Jan 23, 2026
dbc0210
New translations strings.xml (Portuguese)
sameerasw Jan 23, 2026
b72b453
New translations strings.xml (Russian)
sameerasw Jan 23, 2026
17d363b
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 23, 2026
abfc14e
New translations strings.xml (Swedish)
sameerasw Jan 23, 2026
6ac07b1
New translations strings.xml (Turkish)
sameerasw Jan 23, 2026
978c053
New translations strings.xml (Ukrainian)
sameerasw Jan 23, 2026
1bc345e
New translations strings.xml (Chinese Simplified)
sameerasw Jan 23, 2026
43d2b65
New translations strings.xml (Chinese Traditional)
sameerasw Jan 23, 2026
70d2e26
New translations strings.xml (English)
sameerasw Jan 23, 2026
4123b03
New translations strings.xml (Vietnamese)
sameerasw Jan 23, 2026
12ab1c8
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 23, 2026
d85914b
New translations strings.xml (Sinhala)
sameerasw Jan 23, 2026
6700812
New translations strings.xml (Acholi)
sameerasw Jan 23, 2026
31352a4
initial watermark implementation
sameerasw Jan 23, 2026
d7ffb0e
Update source file strings.xml
sameerasw Jan 23, 2026
d694b6e
A lot of watermark options and controls added
sameerasw Jan 23, 2026
54958cb
Fix edge to edge in watermark
sameerasw Jan 23, 2026
def381b
Custom text in watermark
sameerasw Jan 23, 2026
c60f69e
Border for watermark
sameerasw Jan 23, 2026
f2ad74d
Updated font size section in watermark layout
sameerasw Jan 23, 2026
8a12f0c
Material You color for watermark
sameerasw Jan 23, 2026
e99b408
Merge pull request #148 from sameerasw/experimental-watermark
sameerasw Jan 23, 2026
ec73ed7
New translations strings.xml (Romanian)
sameerasw Jan 23, 2026
bdf3585
New translations strings.xml (French)
sameerasw Jan 23, 2026
fc79090
New translations strings.xml (Spanish)
sameerasw Jan 23, 2026
64b3ff0
New translations strings.xml (Afrikaans)
sameerasw Jan 23, 2026
af5ca13
New translations strings.xml (Arabic)
sameerasw Jan 23, 2026
e2426fe
New translations strings.xml (Catalan)
sameerasw Jan 23, 2026
d42c00a
New translations strings.xml (Czech)
sameerasw Jan 23, 2026
6a03994
New translations strings.xml (Danish)
sameerasw Jan 23, 2026
e87a446
New translations strings.xml (German)
sameerasw Jan 23, 2026
c8c6d00
New translations strings.xml (Greek)
sameerasw Jan 23, 2026
60ef875
New translations strings.xml (Finnish)
sameerasw Jan 23, 2026
ef893c3
New translations strings.xml (Hebrew)
sameerasw Jan 23, 2026
bdfe70e
New translations strings.xml (Hungarian)
sameerasw Jan 23, 2026
f1dd354
New translations strings.xml (Italian)
sameerasw Jan 23, 2026
40b96b9
New translations strings.xml (Japanese)
sameerasw Jan 23, 2026
4b4291e
New translations strings.xml (Korean)
sameerasw Jan 23, 2026
fc09e72
New translations strings.xml (Dutch)
sameerasw Jan 23, 2026
59bc3d0
New translations strings.xml (Norwegian)
sameerasw Jan 23, 2026
848101f
New translations strings.xml (Polish)
sameerasw Jan 23, 2026
5c9e161
New translations strings.xml (Portuguese)
sameerasw Jan 23, 2026
ca1d3eb
New translations strings.xml (Russian)
sameerasw Jan 23, 2026
8e8abce
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 23, 2026
4de9e98
New translations strings.xml (Swedish)
sameerasw Jan 23, 2026
c2a0ca8
New translations strings.xml (Turkish)
sameerasw Jan 23, 2026
371c14d
New translations strings.xml (Ukrainian)
sameerasw Jan 23, 2026
7ad481e
New translations strings.xml (Chinese Simplified)
sameerasw Jan 23, 2026
ecb4dca
New translations strings.xml (Chinese Traditional)
sameerasw Jan 23, 2026
136d709
New translations strings.xml (English)
sameerasw Jan 23, 2026
13f3c7d
New translations strings.xml (Vietnamese)
sameerasw Jan 23, 2026
65960ae
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 23, 2026
c874be4
New translations strings.xml (Sinhala)
sameerasw Jan 23, 2026
c9f2ff8
New translations strings.xml (Acholi)
sameerasw Jan 23, 2026
f2de52a
Update source file strings.xml
sameerasw Jan 23, 2026
a675e18
Watermark logo support
sameerasw Jan 23, 2026
a8d9d71
Merge pull request #149 from sameerasw/experimental-watermark
sameerasw Jan 23, 2026
6f6129e
Merge branch 'develop' into l10n_develop
sameerasw Jan 23, 2026
361966a
Merge pull request #147 from sameerasw/l10n_develop
sameerasw Jan 23, 2026
89f3257
New translations strings.xml (Romanian)
sameerasw Jan 23, 2026
3dc74c1
New translations strings.xml (French)
sameerasw Jan 23, 2026
87d4048
New translations strings.xml (Spanish)
sameerasw Jan 23, 2026
4429462
New translations strings.xml (Afrikaans)
sameerasw Jan 23, 2026
c414bbc
New translations strings.xml (Arabic)
sameerasw Jan 23, 2026
6be3344
New translations strings.xml (Catalan)
sameerasw Jan 23, 2026
02b8cc0
New translations strings.xml (Czech)
sameerasw Jan 23, 2026
44fd804
New translations strings.xml (Danish)
sameerasw Jan 23, 2026
25404fc
New translations strings.xml (German)
sameerasw Jan 23, 2026
8180580
New translations strings.xml (Greek)
sameerasw Jan 23, 2026
62cc881
New translations strings.xml (Finnish)
sameerasw Jan 23, 2026
e7ebd55
New translations strings.xml (Hebrew)
sameerasw Jan 23, 2026
671bae5
New translations strings.xml (Hungarian)
sameerasw Jan 23, 2026
d4e4489
New translations strings.xml (Italian)
sameerasw Jan 23, 2026
2a28006
New translations strings.xml (Japanese)
sameerasw Jan 23, 2026
7892b21
New translations strings.xml (Korean)
sameerasw Jan 23, 2026
5970e20
New translations strings.xml (Dutch)
sameerasw Jan 23, 2026
5216644
New translations strings.xml (Norwegian)
sameerasw Jan 23, 2026
b8d1d4f
New translations strings.xml (Polish)
sameerasw Jan 23, 2026
369220a
New translations strings.xml (Portuguese)
sameerasw Jan 23, 2026
463f624
New translations strings.xml (Russian)
sameerasw Jan 23, 2026
4bb963f
New translations strings.xml (Serbian (Cyrillic))
sameerasw Jan 23, 2026
6644ae4
New translations strings.xml (Swedish)
sameerasw Jan 23, 2026
1ff4029
New translations strings.xml (Turkish)
sameerasw Jan 23, 2026
cfff431
New translations strings.xml (Ukrainian)
sameerasw Jan 23, 2026
4c0ae04
New translations strings.xml (Chinese Simplified)
sameerasw Jan 23, 2026
77a36b4
New translations strings.xml (Chinese Traditional)
sameerasw Jan 23, 2026
409c898
New translations strings.xml (English)
sameerasw Jan 23, 2026
78443cc
New translations strings.xml (Vietnamese)
sameerasw Jan 23, 2026
113eef7
New translations strings.xml (Portuguese, Brazilian)
sameerasw Jan 23, 2026
24961a8
New translations strings.xml (Sinhala)
sameerasw Jan 23, 2026
d6eab4c
New translations strings.xml (Acholi)
sameerasw Jan 23, 2026
59ff773
Favorite feature pinning
sameerasw Jan 23, 2026
feb5f06
Fix pitch black in watermark
sameerasw Jan 23, 2026
0aafb29
Merge pull request #150 from sameerasw/l10n_develop
sameerasw Jan 23, 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
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,4 @@ replay_pid*
*.DS_Store
*app/release/

Build/
build/reports/problems/problems-report.html
Build/
5 changes: 4 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,10 @@ dependencies {
// SymSpell for word suggestions
implementation("com.darkrockstudios:symspellkt:3.4.0")

// Glance for Widgets
implementation("androidx.glance:glance-appwidget:1.1.0")
implementation("androidx.glance:glance-material3:1.1.0")

// Watermark dependencies
implementation("androidx.exifinterface:exifinterface:1.3.7")
implementation("androidx.compose.material:material-icons-extended:1.7.0") // Compatible with Compose BOM
}
44 changes: 44 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,18 @@
android:taskAffinity=""
android:theme="@style/Theme.Essentials.Translucent" />

<activity
android:name=".ui.composables.watermark.WatermarkActivity"
android:exported="true"
android:label="@string/feat_watermark_title"
android:theme="@style/Theme.Essentials">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>

<service
android:name=".services.tiles.ScreenOffAccessibilityService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
Expand Down Expand Up @@ -434,6 +446,16 @@
android:value="Automation Service" />
</service>

<service
android:name=".services.EssentialsConditionProvider"
android:label="Essentials Focus"
android:permission="android.permission.BIND_CONDITION_PROVIDER_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.service.notification.ConditionProviderService" />
</intent-filter>
</service>

<service
android:name=".services.tiles.AppFreezingTileService"
android:icon="@drawable/rounded_mode_cool_24"
Expand Down Expand Up @@ -511,6 +533,28 @@
</intent-filter>
</service>

<service
android:name=".services.tiles.PrivateDnsTileService"
android:exported="true"
android:icon="@drawable/rounded_dns_24"
android:label="@string/tile_private_dns"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>

<service
android:name=".services.tiles.UsbDebuggingTileService"
android:exported="true"
android:icon="@drawable/rounded_adb_24"
android:label="@string/tile_usb_debugging"
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
<intent-filter>
<action android:name="android.service.quicksettings.action.QS_TILE" />
</intent-filter>
</service>

<receiver
android:name=".services.receivers.FlashlightActionReceiver"
android:exported="false">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,8 @@ class SettingsRepository(private val context: Context) {
const val KEY_DYNAMIC_NIGHT_LIGHT_ENABLED = "dynamic_night_light_enabled"
const val KEY_DYNAMIC_NIGHT_LIGHT_SELECTED_APPS = "dynamic_night_light_selected_apps"

const val KEY_SNOOZE_DEBUGGING_ENABLED = "snooze_debugging_enabled"
const val KEY_SNOOZE_FILE_TRANSFER_ENABLED = "snooze_file_transfer_enabled"
const val KEY_SNOOZE_CHARGING_ENABLED = "snooze_charging_enabled"
const val KEY_SNOOZE_DISCOVERED_CHANNELS = "snooze_discovered_channels"
const val KEY_SNOOZE_BLOCKED_CHANNELS = "snooze_blocked_channels"

const val KEY_FLASHLIGHT_ALWAYS_TURN_OFF_ENABLED = "flashlight_always_turn_off_enabled"
const val KEY_FLASHLIGHT_FADE_ENABLED = "flashlight_fade_enabled"
Expand Down Expand Up @@ -118,6 +117,8 @@ class SettingsRepository(private val context: Context) {
const val KEY_SHOW_BLUETOOTH_DEVICES = "show_bluetooth_devices"
const val KEY_BATTERY_WIDGET_MAX_DEVICES = "battery_widget_max_devices"
const val KEY_BATTERY_WIDGET_BACKGROUND_ENABLED = "battery_widget_background_enabled"

const val KEY_PINNED_FEATURES = "pinned_features"
}

// Observe changes
Expand All @@ -129,6 +130,17 @@ class SettingsRepository(private val context: Context) {
awaitClose { prefs.unregisterOnSharedPreferenceChangeListener(listener) }
}

val isPitchBlackThemeEnabled: Flow<Boolean> = callbackFlow {
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
if (key == KEY_PITCH_BLACK_THEME_ENABLED) {
trySend(getBoolean(KEY_PITCH_BLACK_THEME_ENABLED))
}
}
trySend(getBoolean(KEY_PITCH_BLACK_THEME_ENABLED))
prefs.registerOnSharedPreferenceChangeListener(listener)
awaitClose { prefs.unregisterOnSharedPreferenceChangeListener(listener) }
}

fun registerOnSharedPreferenceChangeListener(listener: SharedPreferences.OnSharedPreferenceChangeListener) {
prefs.registerOnSharedPreferenceChangeListener(listener)
}
Expand Down Expand Up @@ -299,6 +311,45 @@ class SettingsRepository(private val context: Context) {
saveAppSelection(key, current)
}
}

// Snooze Notifications Helper
fun loadSnoozeDiscoveredChannels(): List<com.sameerasw.essentials.domain.model.SnoozeChannel> {
val json = prefs.getString(KEY_SNOOZE_DISCOVERED_CHANNELS, null)
return if (json != null) {
val type = object : TypeToken<List<com.sameerasw.essentials.domain.model.SnoozeChannel>>() {}.type
try {
gson.fromJson(json, type) ?: emptyList()
} catch (e: Exception) {
emptyList()
}
} else {
emptyList()
}
}

fun saveSnoozeDiscoveredChannels(channels: List<com.sameerasw.essentials.domain.model.SnoozeChannel>) {
val json = gson.toJson(channels)
putString(KEY_SNOOZE_DISCOVERED_CHANNELS, json)
}

fun loadSnoozeBlockedChannels(): Set<String> {
val json = prefs.getString(KEY_SNOOZE_BLOCKED_CHANNELS, null)
return if (json != null) {
val type = object : TypeToken<Set<String>>() {}.type
try {
gson.fromJson(json, type) ?: emptySet()
} catch (e: Exception) {
emptySet()
}
} else {
emptySet()
}
}

fun saveSnoozeBlockedChannels(blockedChannels: Set<String>) {
val json = gson.toJson(blockedChannels)
putString(KEY_SNOOZE_BLOCKED_CHANNELS, json)
}

// Config Export/Import
fun getAllConfigsAsJsonString(): String {
Expand All @@ -312,7 +363,9 @@ class SettingsRepository(private val context: Context) {

p.all.forEach { (key, value) ->
// Skip app lists as requested, and stale data
if (key.endsWith("_selected_apps") || key == "freeze_auto_excluded_apps" || key.startsWith("mac_battery_") || key == "airsync_mac_connected") {
if (key.endsWith("_selected_apps") || key == "freeze_auto_excluded_apps" ||
key.startsWith("mac_battery_") || key == "airsync_mac_connected" ||
key == KEY_SNOOZE_DISCOVERED_CHANNELS) {
return@forEach
}

Expand Down Expand Up @@ -415,4 +468,18 @@ class SettingsRepository(private val context: Context) {

fun isBatteryWidgetBackgroundEnabled(): Boolean = getBoolean(KEY_BATTERY_WIDGET_BACKGROUND_ENABLED, true)
fun setBatteryWidgetBackgroundEnabled(enabled: Boolean) = putBoolean(KEY_BATTERY_WIDGET_BACKGROUND_ENABLED, enabled)

fun getPinnedFeatures(): List<String> {
val json = prefs.getString(KEY_PINNED_FEATURES, null)
return if (json != null) {
try {
gson.fromJson(json, object : TypeToken<List<String>>() {}.type) ?: emptyList()
} catch (e: Exception) { emptyList() }
} else emptyList()
}

fun savePinnedFeatures(features: List<String>) {
val json = gson.toJson(features)
putString(KEY_PINNED_FEATURES, json)
}
}
15 changes: 15 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 @@ -50,4 +50,19 @@ sealed interface Action {
override val permissions: List<String> = listOf("shizuku", "root")
override val isConfigurable: Boolean = true
}

data class DeviceEffects(
val enabled: Boolean = true,
val grayscale: Boolean = false,
val suppressAmbient: Boolean = false,
val dimWallpaper: Boolean = false,
val nightMode: Boolean = false
) : Action {
override val title: Int get() = R.string.diy_action_device_effects
override val icon: Int get() = R.drawable.rounded_bed_24
override val permissions: List<String> = listOf("notification_policy")
override val isConfigurable: Boolean = true
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ data class Automation(
val actions: List<Action> = emptyList(),
val entryAction: Action? = null,
val exitAction: Action? = null,
val isEnabled: Boolean = true
val isEnabled: Boolean = true,
val selectedApps: List<String> = emptyList()
) {
enum class Type {
TRIGGER,
STATE
STATE,
APP
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.sameerasw.essentials.domain.model

data class SnoozeChannel(
val id: String,
val name: String,
val isBlocked: Boolean = false
)
Original file line number Diff line number Diff line change
Expand Up @@ -181,26 +181,7 @@ object FeatureRegistry {
description = R.string.feat_snooze_notifications_desc,
permissionKeys = listOf("NOTIFICATION_LISTENER"),
showToggle = false,
searchableSettings = listOf(
SearchSetting(
R.string.search_snooze_debug_title,
R.string.search_snooze_debug_desc,
"snooze_debugging",
R.array.keywords_adb_debug
),
SearchSetting(
R.string.search_snooze_file_title,
R.string.search_snooze_file_desc,
"snooze_file_transfer",
R.array.keywords_mtp
),
SearchSetting(
R.string.search_snooze_charge_title,
R.string.search_snooze_charge_desc,
"snooze_charging",
R.array.keywords_battery_charge
)
)
searchableSettings = emptyList()
) {
override fun isEnabled(viewModel: MainViewModel) = false
override fun isToggleEnabled(viewModel: MainViewModel, context: Context) = viewModel.isNotificationListenerEnabled.value
Expand Down Expand Up @@ -319,6 +300,20 @@ object FeatureRegistry {
"Stay awake",
R.array.keywords_qs_stay_awake,
R.string.feat_qs_tiles_title
),
SearchSetting(
R.string.search_qs_private_dns_title,
R.string.search_qs_private_dns_desc,
"Private DNS",
R.array.keywords_network_visibility,
R.string.feat_qs_tiles_title
),
SearchSetting(
R.string.search_qs_usb_debugging_title,
R.string.search_qs_usb_debugging_desc,
"USB Debugging",
R.array.keywords_adb_debug,
R.string.feat_qs_tiles_title
)
)
) {
Expand Down Expand Up @@ -523,6 +518,21 @@ object FeatureRegistry {
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
},

object : Feature(
id = "Watermarks",
title = R.string.feat_watermark_title,
iconRes = R.drawable.rounded_draw_24,
category = R.string.cat_tools,
description = R.string.feat_watermark_desc,
showToggle = false
) {
override fun isEnabled(viewModel: MainViewModel) = true
override fun onToggle(viewModel: MainViewModel, context: Context, enabled: Boolean) {}
override fun onClick(context: Context, viewModel: MainViewModel) {
context.startActivity(android.content.Intent(context, com.sameerasw.essentials.ui.composables.watermark.WatermarkActivity::class.java))
}
}
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.sameerasw.essentials.domain.watermark

import android.content.Context
import android.net.Uri
import androidx.exifinterface.media.ExifInterface
import java.io.InputStream

data class ExifData(
val make: String? = null,
val model: String? = null,
val aperture: String? = null,
val shutterSpeed: String? = null,
val iso: String? = null,
val date: String? = null,
val focalLength: String? = null
)

class MetadataProvider(
private val context: Context
) {
fun extractExif(uri: Uri): ExifData {
var inputStream: InputStream? = null
return try {
inputStream = context.contentResolver.openInputStream(uri)
if (inputStream == null) return ExifData()

val exif = ExifInterface(inputStream)

ExifData(
make = exif.getAttribute(ExifInterface.TAG_MAKE),
model = exif.getAttribute(ExifInterface.TAG_MODEL),
aperture = exif.getAttribute(ExifInterface.TAG_F_NUMBER)?.let { "f/$it" },
shutterSpeed = exif.getAttribute(ExifInterface.TAG_EXPOSURE_TIME)?.let { "${it}s" },
iso = exif.getAttribute(ExifInterface.TAG_PHOTOGRAPHIC_SENSITIVITY)?.let { "ISO $it" },
date = exif.getAttribute(ExifInterface.TAG_DATETIME_ORIGINAL),
focalLength = exif.getAttribute(ExifInterface.TAG_FOCAL_LENGTH)?.let { "${it}mm" }
)
} catch (e: Exception) {
e.printStackTrace()
ExifData()
} finally {
inputStream?.close()
}
}
}
Loading