Skip to content

Commit 77e5dbf

Browse files
authored
Merge pull request #3 from bakad3v/dev1
v 1.3.0
2 parents 5cc13e9 + 43e3326 commit 77e5dbf

Some content is hidden

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

55 files changed

+1561
-563
lines changed

README.md

Lines changed: 22 additions & 8 deletions
Large diffs are not rendered by default.

README_RU.md

Lines changed: 24 additions & 10 deletions
Large diffs are not rendered by default.

app/build.gradle.kts

Lines changed: 64 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ android {
1414
applicationId = "com.android.aftools"
1515
minSdk = 26
1616
targetSdk = 34
17-
versionCode = 3
18-
versionName = "1.2.0"
17+
versionCode = 4
18+
versionName = "1.3.0"
1919
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2020
}
2121

@@ -44,52 +44,66 @@ android {
4444
}
4545

4646
dependencies {
47-
val daggerVersion = "2.48"
48-
val datastoreVersion = "1.1.1"
49-
val dhizukuVersion = "2.5.3"
50-
val runtimeKtxVersion = "2.9.1"
51-
val lifecycleVersion = "2.8.4"
52-
val coroutinesVersion = "1.7.3"
53-
val navigationVersion = "2.7.7"
54-
val fragmentVersion = "1.8.2"
55-
val hiltworkerVersion = "1.2.0"
56-
val securityVersion = "1.1.0-alpha06"
57-
val desugaringVersion = "2.0.4"
58-
val hiltVersion = "2.49"
59-
val leakCanaryVersion = "2.12"
60-
val coilVersion = "2.5.0"
61-
val storageVersion = "1.5.5"
62-
val serializeVersion = "1.6.2"
63-
val libsuVersion = "5.0.0"
64-
val hiddenApiBypassVersion = "4.3"
65-
implementation("androidx.core:core-ktx:1.13.1")
66-
implementation("androidx.appcompat:appcompat:1.7.0")
67-
implementation("com.google.android.material:material:1.12.0")
68-
testImplementation("junit:junit:4.13.2")
69-
androidTestImplementation("androidx.test.ext:junit:1.2.1")
70-
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
71-
implementation ("com.google.dagger:dagger:$daggerVersion")
72-
kapt ("com.google.dagger:dagger-compiler:$daggerVersion")
73-
implementation ("androidx.datastore:datastore-preferences:$datastoreVersion")
74-
implementation( "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion")
75-
implementation ("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
76-
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
77-
implementation("androidx.navigation:navigation-fragment-ktx:$navigationVersion")
78-
implementation("androidx.navigation:navigation-ui-ktx:$navigationVersion")
79-
implementation("org.lsposed.hiddenapibypass:hiddenapibypass:$hiddenApiBypassVersion")
80-
implementation("androidx.fragment:fragment-ktx:$fragmentVersion")
81-
kapt ("androidx.hilt:hilt-compiler:$hiltworkerVersion")
82-
implementation ("com.github.topjohnwu.libsu:core:$libsuVersion")
83-
implementation( "androidx.security:security-crypto-ktx:$securityVersion")
84-
coreLibraryDesugaring ("com.android.tools:desugar_jdk_libs:$desugaringVersion")
85-
debugImplementation ("com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion")
86-
implementation ("com.google.dagger:hilt-android:$hiltVersion")
87-
kapt ("com.google.dagger:hilt-compiler:$hiltVersion")
88-
implementation("io.coil-kt:coil:$coilVersion")
89-
implementation ("com.anggrayudi:storage:$storageVersion")
90-
api("org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.4.0")
91-
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializeVersion")
92-
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7")
93-
implementation ("io.github.iamr0s:Dhizuku-API:$dhizukuVersion")
94-
androidTestImplementation ("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion")
47+
// Core Android dependencies
48+
implementation("androidx.core:core-ktx:1.13.1")
49+
implementation("androidx.appcompat:appcompat:1.7.0")
50+
implementation("com.google.android.material:material:1.12.0")
51+
52+
// Testing libraries
53+
testImplementation("junit:junit:4.13.2")
54+
androidTestImplementation("androidx.test.ext:junit:1.2.1")
55+
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
56+
57+
// Dagger Hilt for dependency injection
58+
val daggerVersion = "2.49"
59+
implementation("com.google.dagger:hilt-android:$daggerVersion")
60+
kapt("com.google.dagger:hilt-compiler:$daggerVersion")
61+
62+
// Lifecycle and coroutines
63+
val lifecycleVersion = "2.8.4"
64+
implementation("androidx.lifecycle:lifecycle-livedata-ktx:$lifecycleVersion")
65+
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycleVersion")
66+
67+
val coroutinesVersion = "1.7.3"
68+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
69+
androidTestImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutinesVersion")
70+
71+
// Navigation
72+
val navigationVersion = "2.7.7"
73+
implementation("androidx.navigation:navigation-fragment-ktx:$navigationVersion")
74+
implementation("androidx.navigation:navigation-ui-ktx:$navigationVersion")
75+
76+
// Additional libraries
77+
val datastoreVersion = "1.1.1"
78+
implementation("androidx.datastore:datastore-preferences:$datastoreVersion")
79+
80+
val securityVersion = "1.1.0-alpha06"
81+
implementation("androidx.security:security-crypto-ktx:$securityVersion")
82+
83+
val desugaringVersion = "2.0.4"
84+
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:$desugaringVersion")
85+
86+
// LeakCanary (debug only)
87+
val leakCanaryVersion = "2.12"
88+
debugImplementation("com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion")
89+
90+
// Coil for image loading
91+
val coilVersion = "2.5.0"
92+
implementation("io.coil-kt:coil:$coilVersion")
93+
94+
// Serialization
95+
val serializeVersion = "1.6.2"
96+
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializeVersion")
97+
implementation("org.jetbrains.kotlinx:kotlinx-datetime-jvm:0.4.0")
98+
implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7")
99+
100+
//Dhizuku
101+
val dhizukuVersion = "2.5.3"
102+
implementation ("io.github.iamr0s:Dhizuku-API:$dhizukuVersion")
103+
104+
// Additional dependencies for your project
105+
implementation("org.lsposed.hiddenapibypass:hiddenapibypass:4.3")
106+
implementation("com.github.topjohnwu.libsu:core:5.0.0")
107+
implementation("com.anggrayudi:storage:1.5.5")
108+
95109
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
</intent-filter>
3737
</activity>
3838
<service
39-
android:name=".presentation.services.PasswordReceiverService"
39+
android:name=".presentation.services.TriggerReceiverService"
4040
android:exported="true"
4141
android:directBootAware="true"
4242
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.android.aftools.data.dataMigrations
2+
3+
import android.content.Context
4+
import android.util.Log
5+
import androidx.datastore.core.DataMigration
6+
import androidx.datastore.dataStoreFile
7+
import com.android.aftools.data.serializers.UsbSettingsSerializerV1
8+
import com.android.aftools.datastoreDBA.dataStoreDirectBootAware
9+
import com.android.aftools.datastoreDBA.dataStoreFileDBA
10+
import com.android.aftools.domain.entities.UsbSettings
11+
import dagger.hilt.android.qualifiers.ApplicationContext
12+
import kotlinx.coroutines.flow.first
13+
import javax.inject.Inject
14+
15+
class USBMigrationV1 @Inject constructor(@ApplicationContext private val context: Context, usbSettingsSerializerV1: UsbSettingsSerializerV1): DataMigration<UsbSettings> {
16+
17+
private val Context.oldDatastore by dataStoreDirectBootAware(OLD_USB, usbSettingsSerializerV1)
18+
override suspend fun cleanUp() {
19+
context.dataStoreFileDBA(OLD_USB).delete()
20+
}
21+
22+
override suspend fun migrate(currentData: UsbSettings): UsbSettings {
23+
val oldData = context.oldDatastore.data.first()
24+
return if (oldData.runOnConnection) {
25+
UsbSettings.RUN_ON_CONNECTION
26+
} else {
27+
UsbSettings.DO_NOTHING
28+
}
29+
}
30+
31+
override suspend fun shouldMigrate(currentData: UsbSettings): Boolean {
32+
return context.dataStoreFileDBA(OLD_USB).exists()
33+
}
34+
35+
companion object {
36+
private const val OLD_USB = "usb_datastore.json"
37+
}
38+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.android.aftools.data.repositories
2+
3+
import android.content.Context
4+
import com.android.aftools.data.serializers.ButtonSettingsSerializer
5+
import com.android.aftools.datastoreDBA.dataStoreDirectBootAware
6+
import com.android.aftools.domain.entities.ButtonClicksData
7+
import com.android.aftools.domain.repositories.ButtonSettingsRepository
8+
import dagger.hilt.android.qualifiers.ApplicationContext
9+
import kotlinx.coroutines.flow.first
10+
import javax.inject.Inject
11+
12+
class ButtonSettingsRepositoryImpl @Inject constructor(@ApplicationContext private val context: Context, buttonSettingsSerializer: ButtonSettingsSerializer) : ButtonSettingsRepository {
13+
private var buttonClicksData = ButtonClicksData()
14+
private val Context.buttonDataStore by dataStoreDirectBootAware(DATASTORE_NAME, buttonSettingsSerializer)
15+
16+
override val buttonSettings = context.buttonDataStore.data
17+
18+
19+
override suspend fun updateLatency(latency: Int) {
20+
context.buttonDataStore.updateData {
21+
it.copy(latency=latency)
22+
}
23+
}
24+
25+
override suspend fun updateAllowedClicks(allowedClicks: Int) {
26+
context.buttonDataStore.updateData {
27+
it.copy(allowedClicks = allowedClicks)
28+
}
29+
}
30+
31+
override fun getButtonClicksData(): ButtonClicksData {
32+
return buttonClicksData
33+
}
34+
35+
override fun setClicksInRow(clicks: Int) {
36+
buttonClicksData = buttonClicksData.copy(clicksInRow = clicks)
37+
}
38+
39+
override fun setLastTimestamp(timestamp: Long) {
40+
buttonClicksData= buttonClicksData.copy(lastTimestamp = timestamp)
41+
}
42+
43+
override suspend fun setTriggerOnButtonStatus(status: Boolean) {
44+
context.buttonDataStore.updateData {
45+
it.copy(triggerOnButton = status)
46+
}
47+
}
48+
49+
companion object {
50+
private const val DATASTORE_NAME = "button_datastore.json"
51+
}
52+
}
Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.android.aftools.data.repositories
22

33
import android.content.Context
4+
import com.android.aftools.data.dataMigrations.USBMigrationV1
45
import com.android.aftools.data.serializers.UsbSettingsSerializer
56
import com.android.aftools.datastoreDBA.dataStoreDirectBootAware
67
import com.android.aftools.domain.entities.UsbSettings
@@ -12,15 +13,18 @@ import javax.inject.Inject
1213
/**
1314
* Repository for changing settings of usb protection
1415
*/
15-
class USBSettingsRepositoryImpl @Inject constructor(@ApplicationContext private val context: Context, usbSettingsSerializer: UsbSettingsSerializer):
16+
class USBSettingsRepositoryImpl @Inject constructor(@ApplicationContext private val context: Context, usbSettingsSerializer: UsbSettingsSerializer, private val usbMigrationV1: USBMigrationV1):
1617
UsbSettingsRepository {
1718
private val Context.usbDataStore by dataStoreDirectBootAware(
1819
DATASTORE_NAME,
19-
usbSettingsSerializer
20+
produceMigrations = {
21+
context -> listOf<USBMigrationV1>(usbMigrationV1)
22+
},
23+
serializer = usbSettingsSerializer
2024
)
2125

2226
companion object {
23-
private const val DATASTORE_NAME = "usb_datastore.json"
27+
private const val DATASTORE_NAME = "usb_datastore_v2.json"
2428
}
2529

2630

@@ -29,9 +33,9 @@ class USBSettingsRepositoryImpl @Inject constructor(@ApplicationContext private
2933
/**
3034
* Enable/disable usb protection
3135
*/
32-
override suspend fun setUsbConnectionStatus(status: Boolean) {
36+
override suspend fun setUsbSettings(settings: UsbSettings) {
3337
context.usbDataStore.updateData {
34-
it.copy(runOnConnection = status)
38+
settings
3539
}
3640
}
3741
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.android.aftools.data.serializers
2+
3+
import androidx.datastore.core.Serializer
4+
import com.android.aftools.data.encryption.EncryptionAlias
5+
import com.android.aftools.data.encryption.EncryptionManager
6+
import com.android.aftools.domain.entities.ButtonSettings
7+
import kotlinx.coroutines.Dispatchers
8+
import kotlinx.coroutines.withContext
9+
import kotlinx.serialization.SerializationException
10+
import kotlinx.serialization.json.Json
11+
import java.io.InputStream
12+
import java.io.OutputStream
13+
import javax.inject.Inject
14+
15+
class ButtonSettingsSerializer @Inject constructor(private val encryptionManager: EncryptionManager):
16+
Serializer<ButtonSettings> {
17+
override val defaultValue: ButtonSettings
18+
get() = ButtonSettings()
19+
20+
override suspend fun readFrom(input: InputStream): ButtonSettings {
21+
val decryptedBytes = encryptionManager.decrypt(EncryptionAlias.DATASTORE.name,input)
22+
return try {
23+
Json.decodeFromString(deserializer = ButtonSettings.serializer(),
24+
string = decryptedBytes.decodeToString())
25+
} catch (e: SerializationException) {
26+
defaultValue
27+
}
28+
}
29+
30+
override suspend fun writeTo(
31+
t: ButtonSettings,
32+
output: OutputStream
33+
) {
34+
withContext(Dispatchers.IO) {
35+
encryptionManager.encrypt(
36+
EncryptionAlias.DATASTORE.name,
37+
Json.encodeToString(
38+
serializer = ButtonSettings.serializer(),
39+
value = t
40+
).encodeToByteArray(),
41+
output
42+
)
43+
}
44+
}
45+
46+
}

app/src/main/java/com/android/aftools/data/serializers/UsbSettingsSerializer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import javax.inject.Inject
1515
class UsbSettingsSerializer @Inject constructor(private val encryptionManager: EncryptionManager):
1616
Serializer<UsbSettings> {
1717
override val defaultValue: UsbSettings
18-
get() = UsbSettings()
18+
get() = UsbSettings.DO_NOTHING
1919

2020
override suspend fun readFrom(input: InputStream): UsbSettings {
2121
val decryptedBytes = encryptionManager.decrypt(EncryptionAlias.DATASTORE.name,input)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.android.aftools.data.serializers
2+
3+
import androidx.datastore.core.Serializer
4+
import com.android.aftools.data.encryption.EncryptionAlias
5+
import com.android.aftools.data.encryption.EncryptionManager
6+
import com.android.aftools.domain.entities.UsbSettingsV1
7+
import kotlinx.coroutines.Dispatchers
8+
import kotlinx.coroutines.withContext
9+
import kotlinx.serialization.SerializationException
10+
import kotlinx.serialization.json.Json
11+
import java.io.InputStream
12+
import java.io.OutputStream
13+
import javax.inject.Inject
14+
15+
class UsbSettingsSerializerV1 @Inject constructor(private val encryptionManager: EncryptionManager):
16+
Serializer<UsbSettingsV1> {
17+
override val defaultValue: UsbSettingsV1
18+
get() = UsbSettingsV1()
19+
20+
override suspend fun readFrom(input: InputStream): UsbSettingsV1 {
21+
val decryptedBytes = encryptionManager.decrypt(EncryptionAlias.DATASTORE.name,input)
22+
return try {
23+
Json.decodeFromString(deserializer = UsbSettingsV1.serializer(),
24+
string = decryptedBytes.decodeToString())
25+
} catch (e: SerializationException) {
26+
defaultValue
27+
}
28+
}
29+
30+
override suspend fun writeTo(t: UsbSettingsV1, output: OutputStream) {
31+
withContext(Dispatchers.IO) {
32+
encryptionManager.encrypt(
33+
EncryptionAlias.DATASTORE.name,
34+
Json.encodeToString(
35+
serializer = UsbSettingsV1.serializer(),
36+
value = t
37+
).encodeToByteArray(),
38+
output
39+
)
40+
}
41+
}
42+
43+
}

0 commit comments

Comments
 (0)