Skip to content

feat: WiFi BSSID based alarm cancellation (Addition to Smart Controls) #822

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
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
8 changes: 8 additions & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
Expand Down Expand Up @@ -68,6 +70,12 @@
android:name=".SpotifyPlayerService"
android:enabled="true"
android:exported="true"></service>

<service
android:name=".ultimate_alarm_clock.Utilities.WifiManagerService"
android:enabled="true"
android:exported="true"></service>

<service android:name="com.pravera.flutter_foreground_task.service.ForegroundService" />

<receiver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@ fun getLatestAlarm(db: SQLiteDatabase, wantNextAlarm: Boolean, profile: String,c
"location" to setAlarm.location,
"isWeather" to setAlarm.isWeatherEnabled,
"weatherTypes" to setAlarm.weatherTypes,
"alarmID" to setAlarm.alarmId
"alarmID" to setAlarm.alarmId,
"isWifiEnabled" to setAlarm.isWifiEnabled,
"wifiBSSID" to setAlarm.wifiBSSID
)
Log.d("s", "sdsd ${a}")
return a
Expand Down Expand Up @@ -298,7 +300,9 @@ data class AlarmModel(
val location: String,
val alarmDate: String,
val alarmId: String,
val ringOn: Int
val ringOn: Int,
val isWifiEnabled: Int,
val wifiBSSID: String
) {
companion object {
@SuppressLint("Range")
Expand All @@ -316,6 +320,8 @@ data class AlarmModel(
val alarmDate = cursor.getString(cursor.getColumnIndex("alarmDate"))
val alarmId = cursor.getString(cursor.getColumnIndex("alarmID"))
val ringOn = cursor.getInt(cursor.getColumnIndex("ringOn"))
val isWifiEnabled = cursor.getInt(cursor.getColumnIndex("isWifiEnabled"))
val wifiBSSID = cursor.getString(cursor.getColumnIndex("wifiBSSID"))
return AlarmModel(
id,
minutesSinceMidnight,
Expand All @@ -329,7 +335,9 @@ data class AlarmModel(
location,
alarmDate,
alarmId,
ringOn
ringOn,
isWifiEnabled,
wifiBSSID
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import android.provider.Settings
import android.util.Log
import android.view.WindowManager
import androidx.annotation.NonNull
import com.ccextractor.ultimate_alarm_clock.ultimate_alarm_clock.Utilities.WifiManagerService
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel
Expand Down Expand Up @@ -112,7 +113,9 @@ class MainActivity : FlutterActivity() {
ringTime["isLocation"]!! as Int,
ringTime["location"]!! as String,
ringTime["isWeather"]!! as Int,
ringTime["weatherTypes"]!! as String
ringTime["weatherTypes"]!! as String,
ringTime["isWifiEnabled"]!! as Int,
ringTime["wifiBSSID"]!! as String
)
} else {
println("FLUTTER CALLED CANCEL ALARMS")
Expand Down Expand Up @@ -166,7 +169,9 @@ class MainActivity : FlutterActivity() {
locationMonitor: Int,
setLocation: String,
isWeather: Int,
weatherTypes: String
weatherTypes: String,
isWifiEnabled: Int,
wifiBSSID: String
) {

val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
Expand Down Expand Up @@ -204,7 +209,26 @@ class MainActivity : FlutterActivity() {
editor.putLong("flutter.is_screen_on", 0L)
editor.apply()
}
if (locationMonitor == 1) {
if (isWifiEnabled == 1) {
val sharedPreferences =
getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putString("flutter.wifi_BSSID", wifiBSSID)
Log.d("Wifi BSSID", wifiBSSID)
editor.apply()
val wifiAlarmIntent = Intent(this, WifiManagerService::class.java)
val pendingWifiAlarmIntent = PendingIntent.getService(
this,
10,
wifiAlarmIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
)
val alarmClockInfo = AlarmManager.AlarmClockInfo(triggerTime, pendingIntent)
alarmManager.setAlarmClock(
alarmClockInfo,
pendingWifiAlarmIntent
)
} else if (locationMonitor == 1) {
val sharedPreferences =
getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.ccextractor.ultimate_alarm_clock.ultimate_alarm_clock.Utilities

import android.app.Service
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.ConnectivityManager
import android.net.wifi.WifiInfo
import android.net.wifi.WifiManager
import android.os.Build
import android.os.IBinder
import com.ccextractor.ultimate_alarm_clock.LogDatabaseHelper
import com.ccextractor.ultimate_alarm_clock.MainActivity
import kotlinx.coroutines.runBlocking

class WifiManagerService: Service() {

override fun onCreate(): Unit = runBlocking {
super.onCreate()

val currBSSID = getCurrentBSSID(this@WifiManagerService)
val logdbHelper = LogDatabaseHelper(this@WifiManagerService)
if(currBSSID != null){
println("WIFI BSSID: $currBSSID")

val sharedPreferences = getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE)
val wifiBSSID: String = sharedPreferences.getString("flutter.wifi_BSSID", "")!!

if(wifiBSSID != currBSSID){
println("Phone connected to some different wifi network.")
val flutterIntent =
Intent(this@WifiManagerService, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
putExtra("initialRoute", "/")
putExtra("alarmRing", "true")
putExtra("isAlarm", "true")

}
println("ANDROID STARTING APP")
[email protected](flutterIntent)
logdbHelper.insertLog(
"Alarm is ringing. Phone is connected to different wifi network than what was specified.",
status = LogDatabaseHelper.Status.SUCCESS,
type = LogDatabaseHelper.LogType.NORMAL,
hasRung = 1
)

stopSelf()
}
else{
logdbHelper.insertLog(
"Alarm doesn't ring. Phone is connected to the same wifi network as what was specified.",
status = LogDatabaseHelper.Status.WARNING,
type = LogDatabaseHelper.LogType.NORMAL,
hasRung = 1
)
stopSelf()
}
}
else {
println("NO WIFI CONNECTED!")
val flutterIntent =
Intent(this@WifiManagerService, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
putExtra("initialRoute", "/")
putExtra("alarmRing", "true")
putExtra("isAlarm", "true")

}
println("ANDROID STARTING APP")
[email protected](flutterIntent)
logdbHelper.insertLog(
"Alarm is ringing. Phone is not connected to any wifi.",
status = LogDatabaseHelper.Status.SUCCESS,
type = LogDatabaseHelper.LogType.NORMAL,
hasRung = 1
)

stopSelf()
}

stopSelf()
}

fun getCurrentBSSID(context: Context): String? {
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

val info = wifiManager.connectionInfo
return info?.bssid
}

override fun onBind(p0: Intent?): IBinder? {
return null
}
}
23 changes: 21 additions & 2 deletions lib/app/data/models/alarm_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ class AlarmModel {
late int guardianTimer;
late String guardian;
late bool isCall;
late bool isWifiEnabled;
late String wifiName;
late String wifiBSSID;
@ignore
Map? offsetDetails;

Expand Down Expand Up @@ -109,7 +112,11 @@ class AlarmModel {
required this.isGuardian,
required this.guardianTimer,
required this.guardian,
required this.isCall});
required this.isCall,
required this.isWifiEnabled,
required this.wifiName,
required this.wifiBSSID,
});

AlarmModel.fromDocumentSnapshot({
required firestore.DocumentSnapshot documentSnapshot,
Expand Down Expand Up @@ -231,6 +238,9 @@ class AlarmModel {
guardian: map['guardian'],
isCall: map['isCall'] == 1,
ringOn: map['ringOn'] == 1,
isWifiEnabled: map['isWifiEnabled'] == 1,
wifiName: map['wifiName'],
wifiBSSID: map['wifiBSSID'],
);
}

Expand Down Expand Up @@ -283,6 +293,9 @@ class AlarmModel {
'guardianTimer': guardianTimer,
'guardian': guardian,
'isCall': isCall ? 1 : 0,
'isWifiEnabled': isWifiEnabled ? 1 : 0,
'wifiName': wifiName,
'wifiBSSID': wifiBSSID,
};
}

Expand Down Expand Up @@ -338,6 +351,9 @@ class AlarmModel {
guardian = alarmData['guardian'];
isCall = alarmData['isCall'];
ringOn = alarmData['ringOn'];
isWifiEnabled = alarmData['isWifiEnabled'];
wifiName = alarmData['wifiName'];
wifiBSSID = alarmData['wifiBSSID'];
}

AlarmModel.fromJson(String alarmData, UserModel? user) {
Expand Down Expand Up @@ -395,7 +411,10 @@ class AlarmModel {
'guardianTimer': alarmRecord.guardianTimer,
'guardian': alarmRecord.guardian,
'isCall': alarmRecord.isCall,
'ringOn': alarmRecord.ringOn
'ringOn': alarmRecord.ringOn,
'isWifiEnabled': alarmRecord.isWifiEnabled,
'wifiName': alarmRecord.wifiName,
'wifiBSSID': alarmRecord.wifiBSSID
};

if (alarmRecord.isSharedAlarmEnabled) {
Expand Down
Loading