Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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: 3 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/AndroidProjectSystem.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions .idea/deploymentTargetSelector.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/markdown.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions .idea/runConfigurations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:ignore="QueryAllPackagesPermission" />

<application
android:name=".SwiftSlateApp"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@ import androidx.lifecycle.AndroidViewModel
import com.musheer360.swiftslate.manager.CommandManager
import com.musheer360.swiftslate.manager.KeyManager
import com.musheer360.swiftslate.manager.StatsManager
import com.musheer360.swiftslate.model.StablePrefs

class SwiftSlateViewModel(application: Application) : AndroidViewModel(application) {
val prefs: SharedPreferences = application.getSharedPreferences("settings", Context.MODE_PRIVATE)
private val rawPrefs: SharedPreferences = application.getSharedPreferences("settings", Context.MODE_PRIVATE)
val prefs = StablePrefs(rawPrefs)
val keyManager = KeyManager(application)
val commandManager = CommandManager(application)
val statsManager = StatsManager(application)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.musheer360.swiftslate.manager

import android.content.SharedPreferences

object BlocklistManager {
private const val KEY = "blocked_packages"

fun getBlocklist(prefs: SharedPreferences): Set<String> {
return prefs.getStringSet(KEY, emptySet()) ?: emptySet()
}

fun addApp(prefs: SharedPreferences, packageName: String) {
val current = getBlocklist(prefs).toMutableSet()
current.add(packageName)
prefs.edit().putStringSet(KEY, current).apply()
}

fun removeApp(prefs: SharedPreferences, packageName: String) {
val current = getBlocklist(prefs).toMutableSet()
current.remove(packageName)
prefs.edit().putStringSet(KEY, current).apply()
}

fun isBlocked(prefs: SharedPreferences, packageName: String): Boolean {
return packageName in getBlocklist(prefs)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ package com.musheer360.swiftslate.manager

import android.content.Context
import android.content.SharedPreferences
import androidx.compose.runtime.Stable
import com.musheer360.swiftslate.model.Command
import com.musheer360.swiftslate.model.CommandType
import org.json.JSONArray
import org.json.JSONObject

@Stable
class CommandManager(context: Context) {
private val prefs: SharedPreferences = context.getSharedPreferences("commands", Context.MODE_PRIVATE)
private val settingsPrefs: SharedPreferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.content.SharedPreferences
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import android.util.Base64
import androidx.compose.runtime.Stable
import org.json.JSONArray
import java.nio.charset.StandardCharsets
import java.security.KeyStore
Expand All @@ -14,6 +15,7 @@ import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.GCMParameterSpec

@Stable
class KeyManager(context: Context) {
private val prefs: SharedPreferences = context.getSharedPreferences("secure_keys_prefs", Context.MODE_PRIVATE)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package com.musheer360.swiftslate.manager

import android.content.Context
import android.content.SharedPreferences
import androidx.compose.runtime.Stable
import org.json.JSONObject
import java.text.SimpleDateFormat
import java.util.Locale

@Stable
class StatsManager(context: Context) {
private val prefs: SharedPreferences = context.getSharedPreferences("stats", Context.MODE_PRIVATE)

Expand Down
17 changes: 17 additions & 0 deletions app/src/main/java/com/musheer360/swiftslate/model/AppInfo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.musheer360.swiftslate.model

import android.content.SharedPreferences
import android.graphics.drawable.Drawable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.Stable

@Immutable
data class AppInfo(
val name: String,
val packageName: String,
val icon: Drawable
)

@Stable
class StablePrefs(val prefs: SharedPreferences)

Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ import com.musheer360.swiftslate.api.ApiException
import com.musheer360.swiftslate.api.GeminiClient
import com.musheer360.swiftslate.api.GenerateResult
import com.musheer360.swiftslate.api.OpenAICompatibleClient
import com.musheer360.swiftslate.manager.BlocklistManager
import com.musheer360.swiftslate.manager.CommandManager
import com.musheer360.swiftslate.manager.KeyManager
import com.musheer360.swiftslate.manager.StatsManager
Expand Down Expand Up @@ -163,9 +164,13 @@ class AssistantService : AccessibilityService() {

override fun onAccessibilityEvent(event: AccessibilityEvent?) {
if (event?.eventType != AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED) return
if (event.packageName?.toString() == packageName) return
val eventPackage = event.packageName?.toString() ?: return
if (eventPackage == packageName) return
if (!::keyManager.isInitialized) return

val prefs = applicationContext.getSharedPreferences("settings", Context.MODE_PRIVATE)
if (BlocklistManager.isBlocked(prefs, eventPackage)) return

if (isProcessing.get()) return
val source = event.source ?: return
if (source.isPassword) {
Expand Down
Loading