Update: 2026-05-15 03:27:21

This commit is contained in:
Hamza-Ayed
2026-05-15 03:27:21 +03:00
parent dd4fcb9bee
commit 8916b4648d
9 changed files with 361 additions and 17 deletions

View File

@@ -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))
}

View 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()
}
}

View File

@@ -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

View File

@@ -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}")

View File

@@ -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() {