Skip to content

Commit eab529b

Browse files
authored
Merge pull request #3 from sameerasw/develop
Develop
2 parents 32e4aa0 + d9ee588 commit eab529b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+2527
-377
lines changed

app/build.gradle.kts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ android {
1212

1313
defaultConfig {
1414
applicationId = "com.sameerasw.essentials"
15-
minSdk = 30
15+
minSdk = 23
1616
targetSdk = 36
17-
versionCode = 1
18-
versionName = "1.0"
17+
versionCode = 2
18+
versionName = "2.0"
1919

2020
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2121
}
@@ -61,4 +61,8 @@ dependencies {
6161
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
6262
debugImplementation(libs.androidx.compose.ui.tooling)
6363
debugImplementation(libs.androidx.compose.ui.test.manifest)
64+
65+
// Shizuku
66+
implementation(libs.shizuku.api)
67+
implementation(libs.shizuku.provider)
6468
}

app/src/main/AndroidManifest.xml

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33
xmlns:tools="http://schemas.android.com/tools">
44

55
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
6+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
67
<uses-permission android:name="android.permission.VIBRATE" />
8+
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
9+
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
10+
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
11+
<uses-permission android:name="android.permission.WAKE_LOCK" />
12+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
13+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_SPECIAL_USE" />
14+
<uses-permission android:name="moe.shizuku.manager.permission.API_V23" />
715

816
<application
917
android:allowBackup="true"
@@ -41,7 +49,7 @@
4149
</activity>
4250

4351
<service
44-
android:name=".ScreenOffAccessibilityService"
52+
android:name=".services.ScreenOffAccessibilityService"
4553
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
4654
android:exported="true">
4755
<intent-filter>
@@ -62,6 +70,29 @@
6270
android:name="android.appwidget.provider"
6371
android:resource="@xml/screen_off_widget_info" />
6472
</receiver>
73+
74+
<service
75+
android:name=".services.CaffeinateTileService"
76+
android:exported="true"
77+
android:icon="@drawable/rounded_coffee_24"
78+
android:label="Caffeinate"
79+
android:permission="android.permission.BIND_QUICK_SETTINGS_TILE">
80+
<intent-filter>
81+
<action android:name="android.service.quicksettings.action.QS_TILE" />
82+
</intent-filter>
83+
</service>
84+
<service
85+
android:name=".services.CaffeinateWakeLockService"
86+
android:exported="false"
87+
android:foregroundServiceType="specialUse" />
88+
89+
<provider
90+
android:name="rikka.shizuku.ShizukuProvider"
91+
android:authorities="${applicationId}.shizuku"
92+
android:multiprocess="false"
93+
android:enabled="true"
94+
android:exported="true"
95+
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
6596
</application>
6697

6798
</manifest>

app/src/main/java/com/sameerasw/essentials/FeatureSettingsActivity.kt

Lines changed: 57 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,17 @@ import androidx.compose.runtime.setValue
2323
import androidx.compose.ui.Modifier
2424
import androidx.compose.ui.input.nestedscroll.nestedScroll
2525
import androidx.compose.ui.platform.LocalContext
26-
import com.sameerasw.essentials.ui.composables.HapticFeedbackPicker
27-
import com.sameerasw.essentials.ui.composables.ReusableTopAppBar
28-
import com.sameerasw.essentials.ui.composables.SettingsCard
26+
import androidx.compose.ui.unit.dp
27+
import com.sameerasw.essentials.ui.components.ReusableTopAppBar
2928
import com.sameerasw.essentials.ui.theme.EssentialsTheme
3029
import com.sameerasw.essentials.utils.HapticFeedbackType
31-
import com.sameerasw.essentials.utils.performHapticFeedback
3230
import androidx.lifecycle.viewmodel.compose.viewModel
31+
import com.sameerasw.essentials.ui.composables.configs.StatusBarIconSettingsUI
32+
import com.sameerasw.essentials.ui.composables.configs.CaffeinateSettingsUI
33+
import com.sameerasw.essentials.ui.composables.configs.ScreenOffWidgetSettingsUI
34+
import com.sameerasw.essentials.viewmodels.CaffeinateViewModel
35+
import com.sameerasw.essentials.viewmodels.MainViewModel
36+
import com.sameerasw.essentials.viewmodels.StatusBarIconViewModel
3337

3438
@OptIn(ExperimentalMaterial3Api::class)
3539
class FeatureSettingsActivity : ComponentActivity() {
@@ -38,6 +42,12 @@ class FeatureSettingsActivity : ComponentActivity() {
3842
super.onCreate(savedInstanceState)
3943
enableEdgeToEdge()
4044
val feature = intent.getStringExtra("feature") ?: "Feature"
45+
val featureDescriptions = mapOf(
46+
"Screen off widget" to "Invisible widget to turn the screen off",
47+
"Statusbar icons" to "Control the visibility of statusbar icons",
48+
"Caffeinate" to "Keep the screen awake"
49+
)
50+
val description = featureDescriptions[feature] ?: ""
4151
setContent {
4252
EssentialsTheme {
4353
val context = LocalContext.current
@@ -60,7 +70,7 @@ class FeatureSettingsActivity : ComponentActivity() {
6070
mutableStateOf(
6171
try {
6272
HapticFeedbackType.valueOf(name ?: HapticFeedbackType.SUBTLE.name)
63-
} catch (e: Exception) {
73+
} catch (@Suppress("UNUSED_PARAMETER") e: Exception) {
6474
HapticFeedbackType.SUBTLE
6575
}
6676
)
@@ -76,7 +86,8 @@ class FeatureSettingsActivity : ComponentActivity() {
7686
hasBack = true,
7787
hasSearch = false,
7888
onBackClick = { finish() },
79-
scrollBehavior = scrollBehavior
89+
scrollBehavior = scrollBehavior,
90+
subtitle = description
8091
)
8192
}
8293
) { innerPadding ->
@@ -86,19 +97,47 @@ class FeatureSettingsActivity : ComponentActivity() {
8697
.fillMaxSize()
8798
.verticalScroll(rememberScrollState())
8899
) {
89-
90-
SettingsCard(title = "Haptic Feedback") {
91-
HapticFeedbackPicker(
92-
selectedFeedback = selectedHaptic,
93-
onFeedbackSelected = { type ->
94-
prefs.edit().putString("haptic_feedback_type", type.name).commit()
95-
selectedHaptic = type
96-
viewModel.setHapticFeedback(type, context)
97-
if (vibrator != null) {
98-
performHapticFeedback(vibrator, type)
99-
}
100+
when (feature) {
101+
"Screen off widget" -> {
102+
ScreenOffWidgetSettingsUI(
103+
viewModel = viewModel,
104+
selectedHaptic = selectedHaptic,
105+
onHapticSelected = { type -> selectedHaptic = type },
106+
vibrator = vibrator,
107+
prefs = prefs,
108+
modifier = Modifier.padding(top = 16.dp)
109+
)
110+
}
111+
"Statusbar icons" -> {
112+
val statusBarViewModel: StatusBarIconViewModel = viewModel()
113+
LaunchedEffect(Unit) {
114+
statusBarViewModel.check(context)
115+
}
116+
StatusBarIconSettingsUI(
117+
viewModel = statusBarViewModel,
118+
modifier = Modifier.padding(top = 16.dp)
119+
)
120+
}
121+
"Caffeinate" -> {
122+
val caffeinateViewModel: CaffeinateViewModel = viewModel()
123+
LaunchedEffect(Unit) {
124+
caffeinateViewModel.check(context)
100125
}
101-
)
126+
CaffeinateSettingsUI(
127+
viewModel = caffeinateViewModel,
128+
modifier = Modifier.padding(top = 16.dp)
129+
)
130+
}
131+
else -> {
132+
ScreenOffWidgetSettingsUI(
133+
viewModel = viewModel,
134+
selectedHaptic = selectedHaptic,
135+
onHapticSelected = { type -> selectedHaptic = type },
136+
vibrator = vibrator,
137+
prefs = prefs,
138+
modifier = Modifier.padding(top = 16.dp)
139+
)
140+
}
102141
}
103142
}
104143
}

app/src/main/java/com/sameerasw/essentials/MainActivity.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ import androidx.compose.material3.rememberTopAppBarState
1515
import androidx.compose.runtime.*
1616
import androidx.compose.ui.input.nestedscroll.nestedScroll
1717
import androidx.compose.ui.Modifier
18-
import com.sameerasw.essentials.ui.composables.ReusableTopAppBar
19-
import com.sameerasw.essentials.ui.composables.ScreenOffWidgetSetup
18+
import androidx.compose.ui.platform.LocalContext
19+
import com.sameerasw.essentials.ui.components.ReusableTopAppBar
20+
import com.sameerasw.essentials.ui.composables.SetupFeatures
2021
import com.sameerasw.essentials.ui.theme.EssentialsTheme
22+
import com.sameerasw.essentials.utils.ShizukuUtils
23+
import com.sameerasw.essentials.viewmodels.MainViewModel
2124

2225
@OptIn(ExperimentalMaterial3Api::class)
2326
class MainActivity : ComponentActivity() {
@@ -26,11 +29,20 @@ class MainActivity : ComponentActivity() {
2629
override fun onCreate(savedInstanceState: Bundle?) {
2730
super.onCreate(savedInstanceState)
2831
enableEdgeToEdge()
32+
// Initialize Shizuku
33+
ShizukuUtils.initialize()
2934
// initialize permission registry
3035
initPermissionRegistry()
3136
viewModel.check(this)
3237
setContent {
3338
EssentialsTheme {
39+
val context = LocalContext.current
40+
val versionName = try {
41+
context.packageManager.getPackageInfo(context.packageName, 0).versionName
42+
} catch (_: Exception) {
43+
"Unknown"
44+
}
45+
3446
var searchRequested by remember { mutableStateOf(false) }
3547
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
3648
Scaffold(
@@ -44,11 +56,12 @@ class MainActivity : ComponentActivity() {
4456
hasSettings = true,
4557
onSearchClick = { searchRequested = true },
4658
onSettingsClick = { startActivity(Intent(this, SettingsActivity::class.java)) },
47-
scrollBehavior = scrollBehavior
59+
scrollBehavior = scrollBehavior,
60+
subtitle = "V$versionName"
4861
)
4962
}
5063
) { innerPadding ->
51-
ScreenOffWidgetSetup(
64+
SetupFeatures(
5265
viewModel = viewModel,
5366
modifier = Modifier.padding(innerPadding),
5467
searchRequested = searchRequested,

app/src/main/java/com/sameerasw/essentials/MainViewModel.kt

Lines changed: 0 additions & 54 deletions
This file was deleted.

app/src/main/java/com/sameerasw/essentials/PermissionRegistry.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ object PermissionRegistry {
1515
fun initPermissionRegistry() {
1616
// Key for accessibility (use unique string)
1717
PermissionRegistry.register("ACCESSIBILITY", "Screen off widget")
18+
// Key for write secure settings
19+
PermissionRegistry.register("WRITE_SECURE_SETTINGS", "Statusbar icons")
1820
// add other registrations here if needed in future
1921
}
2022

app/src/main/java/com/sameerasw/essentials/ScreenOffWidgetProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.appwidget.AppWidgetProvider
66
import android.content.Context
77
import android.content.Intent
88
import android.widget.RemoteViews
9+
import com.sameerasw.essentials.services.ScreenOffAccessibilityService
910

1011
class ScreenOffWidgetProvider : AppWidgetProvider() {
1112

0 commit comments

Comments
 (0)