Update: 2026-05-15 03:27:21
This commit is contained in:
@@ -25,6 +25,9 @@ import androidx.lifecycle.lifecycleScope
|
||||
import kotlinx.coroutines.launch
|
||||
import com.jordanbot.autoride.subscription.SubscriptionManager
|
||||
|
||||
import androidx.appcompat.app.AppCompatDelegate
|
||||
import com.jordanbot.autoride.filter.FilterEngine
|
||||
|
||||
class MainActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var tvStatus: TextView
|
||||
@@ -33,8 +36,21 @@ class MainActivity : AppCompatActivity() {
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// Apply Theme
|
||||
val prefs = getSharedPreferences("ThemePrefs", MODE_PRIVATE)
|
||||
val isDark = prefs.getBoolean("dark_mode", true)
|
||||
if (isDark) {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
} else {
|
||||
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
}
|
||||
|
||||
setContentView(R.layout.activity_main)
|
||||
|
||||
// Load Settings
|
||||
FilterEngine.init(this)
|
||||
|
||||
// Load cached subscription data
|
||||
SubscriptionManager.loadLocalCache(this)
|
||||
|
||||
@@ -51,6 +67,10 @@ class MainActivity : AppCompatActivity() {
|
||||
startActivity(Intent(this, SubscriptionActivity::class.java))
|
||||
}
|
||||
|
||||
findViewById<Button>(R.id.btn_settings).setOnClickListener {
|
||||
startActivity(Intent(this, SettingsActivity::class.java))
|
||||
}
|
||||
|
||||
findViewById<Button>(R.id.btn_notification).setOnClickListener {
|
||||
startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS))
|
||||
}
|
||||
|
||||
81
app/src/main/java/com/jordanbot/autoride/SettingsActivity.kt
Normal file
81
app/src/main/java/com/jordanbot/autoride/SettingsActivity.kt
Normal file
@@ -0,0 +1,81 @@
|
||||
package com.jordanbot.autoride
|
||||
|
||||
import android.os.Bundle
|
||||
import android.widget.Button
|
||||
import android.widget.CheckBox
|
||||
import android.widget.EditText
|
||||
import android.widget.Switch
|
||||
import android.widget.Toast
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.jordanbot.autoride.filter.FilterEngine
|
||||
|
||||
class SettingsActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var etMinPrice: EditText
|
||||
private lateinit var etMaxMinutes: EditText
|
||||
private lateinit var switchAutoAccept: Switch
|
||||
private lateinit var cbUber: CheckBox
|
||||
private lateinit var cbCareem: CheckBox
|
||||
private lateinit var cbJeeny: CheckBox
|
||||
private lateinit var switchDarkMode: Switch
|
||||
private lateinit var btnSave: Button
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.activity_settings)
|
||||
|
||||
etMinPrice = findViewById(R.id.et_min_price)
|
||||
etMaxMinutes = findViewById(R.id.et_max_minutes)
|
||||
switchAutoAccept = findViewById(R.id.switch_auto_accept)
|
||||
cbUber = findViewById(R.id.cb_uber)
|
||||
cbCareem = findViewById(R.id.cb_careem)
|
||||
cbJeeny = findViewById(R.id.cb_jeeny)
|
||||
switchDarkMode = findViewById(R.id.switch_dark_mode)
|
||||
btnSave = findViewById(R.id.btn_save_settings)
|
||||
|
||||
loadCurrentSettings()
|
||||
|
||||
btnSave.setOnClickListener {
|
||||
saveSettings()
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadCurrentSettings() {
|
||||
FilterEngine.init(this)
|
||||
etMinPrice.setText(FilterEngine.minPriceJod.toString())
|
||||
etMaxMinutes.setText(FilterEngine.maxMinutesAway.toString())
|
||||
switchAutoAccept.isChecked = FilterEngine.isEnabled
|
||||
cbUber.isChecked = FilterEngine.enableUber
|
||||
cbCareem.isChecked = FilterEngine.enableCareem
|
||||
cbJeeny.isChecked = FilterEngine.enableJeeny
|
||||
|
||||
val prefs = getSharedPreferences("ThemePrefs", MODE_PRIVATE)
|
||||
switchDarkMode.isChecked = prefs.getBoolean("dark_mode", true)
|
||||
}
|
||||
|
||||
private fun saveSettings() {
|
||||
val price = etMinPrice.text.toString().toDoubleOrNull() ?: 1.0
|
||||
val minutes = etMaxMinutes.text.toString().toIntOrNull() ?: 10
|
||||
val autoAccept = switchAutoAccept.isChecked
|
||||
val uber = cbUber.isChecked
|
||||
val careem = cbCareem.isChecked
|
||||
val jeeny = cbJeeny.isChecked
|
||||
|
||||
FilterEngine.save(price, minutes, autoAccept, uber, careem, jeeny)
|
||||
|
||||
val prefs = getSharedPreferences("ThemePrefs", MODE_PRIVATE)
|
||||
val currentDark = prefs.getBoolean("dark_mode", true)
|
||||
val newDark = switchDarkMode.isChecked
|
||||
|
||||
prefs.edit().putBoolean("dark_mode", newDark).apply()
|
||||
|
||||
Toast.makeText(this, "تم حفظ الإعدادات بنجاح", Toast.LENGTH_SHORT).show()
|
||||
|
||||
if (currentDark != newDark) {
|
||||
// Theme changed, restart app or recreate
|
||||
Toast.makeText(this, "يرجى إعادة تشغيل التطبيق لتطبيق المظهر الجديد", Toast.LENGTH_LONG).show()
|
||||
}
|
||||
|
||||
finish()
|
||||
}
|
||||
}
|
||||
@@ -1,17 +1,58 @@
|
||||
package com.jordanbot.autoride.filter
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
import com.jordanbot.autoride.model.RideRequest
|
||||
|
||||
class FilterEngine {
|
||||
object FilterEngine {
|
||||
|
||||
// These will eventually come from SharedPreferences / UI
|
||||
private const val PREFS_NAME = "BotSettings"
|
||||
private lateinit var prefs: SharedPreferences
|
||||
|
||||
var minPriceJod: Double = 1.0
|
||||
var maxMinutesAway: Int = 10
|
||||
var isEnabled: Boolean = true
|
||||
|
||||
var enableUber: Boolean = true
|
||||
var enableCareem: Boolean = true
|
||||
var enableJeeny: Boolean = true
|
||||
|
||||
fun init(context: Context) {
|
||||
prefs = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
|
||||
load()
|
||||
}
|
||||
|
||||
fun load() {
|
||||
minPriceJod = prefs.getFloat("min_price", 1.0f).toDouble()
|
||||
maxMinutesAway = prefs.getInt("max_minutes", 10)
|
||||
isEnabled = prefs.getBoolean("auto_accept", true)
|
||||
enableUber = prefs.getBoolean("enable_uber", true)
|
||||
enableCareem = prefs.getBoolean("enable_careem", true)
|
||||
enableJeeny = prefs.getBoolean("enable_jeeny", true)
|
||||
}
|
||||
|
||||
fun save(price: Double, minutes: Int, autoAccept: Boolean, uber: Boolean, careem: Boolean, jeeny: Boolean) {
|
||||
prefs.edit().apply {
|
||||
putFloat("min_price", price.toFloat())
|
||||
putInt("max_minutes", minutes)
|
||||
putBoolean("auto_accept", autoAccept)
|
||||
putBoolean("enable_uber", uber)
|
||||
putBoolean("enable_careem", careem)
|
||||
putBoolean("enable_jeeny", jeeny)
|
||||
apply()
|
||||
}
|
||||
load()
|
||||
}
|
||||
|
||||
fun evaluate(request: RideRequest): Boolean {
|
||||
if (!isEnabled) return false
|
||||
|
||||
// Check app package
|
||||
val pkg = request.appPackage
|
||||
if (pkg.contains("uber") && !enableUber) return false
|
||||
if (pkg.contains("careem") && !enableCareem) return false
|
||||
if (pkg.contains("jeeny") && !enableJeeny) return false
|
||||
|
||||
// Check Price
|
||||
if (request.priceJod != null && request.priceJod < minPriceJod) {
|
||||
return false
|
||||
|
||||
@@ -16,7 +16,6 @@ import com.jordanbot.autoride.model.RideRequest
|
||||
class RideAccessibilityService : AccessibilityService() {
|
||||
|
||||
private val handler = Handler(Looper.getMainLooper())
|
||||
private val filterEngine = FilterEngine()
|
||||
|
||||
override fun onAccessibilityEvent(event: AccessibilityEvent) {
|
||||
val rootNode = rootInActiveWindow ?: return
|
||||
@@ -114,8 +113,10 @@ class RideAccessibilityService : AccessibilityService() {
|
||||
override fun onServiceConnected() {
|
||||
super.onServiceConnected()
|
||||
|
||||
FilterEngine.init(this)
|
||||
|
||||
RideDataMerger.onRideReady = { mergedRide ->
|
||||
val passesFilters = filterEngine.evaluate(mergedRide)
|
||||
val passesFilters = FilterEngine.evaluate(mergedRide)
|
||||
val canAccept = SubscriptionManager.canAcceptRides
|
||||
|
||||
Log.d("JordanBot", "🏁 Merger callback: PassesFilters=$passesFilters, CanAcceptQuota=$canAccept for ${mergedRide.appPackage}")
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.util.Log
|
||||
import com.jordanbot.autoride.api.ApiClient
|
||||
import com.jordanbot.autoride.api.RideLogRequest
|
||||
import com.jordanbot.autoride.filter.FilterEngine
|
||||
import com.jordanbot.autoride.engine.RideDataMerger
|
||||
import com.jordanbot.autoride.parser.*
|
||||
import com.jordanbot.autoride.utils.DeviceUtils
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -25,7 +26,6 @@ import kotlinx.coroutines.launch
|
||||
class RideNotificationListener : NotificationListenerService() {
|
||||
|
||||
private val serviceScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
|
||||
private val filterEngine = FilterEngine()
|
||||
private lateinit var fusedLocationClient: FusedLocationProviderClient
|
||||
|
||||
override fun onCreate() {
|
||||
|
||||
Reference in New Issue
Block a user