Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
32ba5bc
began refactoring ui
TobiasRoeddiger Feb 12, 2026
ad5f9e6
more tweaks
TobiasRoeddiger Feb 12, 2026
6aa7aeb
vibe coded to hell for better UX
TobiasRoeddiger Feb 13, 2026
d7489b5
handle it more gracefully if bluetooth is turned off
TobiasRoeddiger Feb 13, 2026
5b6898e
basic self test
TobiasRoeddiger Feb 13, 2026
f6e1c5a
added missing files
TobiasRoeddiger Feb 13, 2026
6e7b4ab
updated the overview page
TobiasRoeddiger Feb 13, 2026
f8b328d
updated the overview page
TobiasRoeddiger Feb 13, 2026
03e6c6c
more tweaks
TobiasRoeddiger Feb 13, 2026
f3ee8d3
improved device details page and icons and also added about page
TobiasRoeddiger Feb 14, 2026
b9ee9b5
added missing files
TobiasRoeddiger Feb 14, 2026
0966e86
unify device views
TobiasRoeddiger Feb 14, 2026
b20cf42
improved the details page further
TobiasRoeddiger Feb 14, 2026
cbba6bf
improved sensor config and update pages
TobiasRoeddiger Feb 14, 2026
ee4fad5
fine tune further issues
TobiasRoeddiger Feb 14, 2026
3e3df0f
further refinements to sensor config view
TobiasRoeddiger Feb 15, 2026
19df991
added lsl support
TobiasRoeddiger Feb 15, 2026
8951ade
more ui improvements
TobiasRoeddiger Feb 15, 2026
32f73d2
fixed stuff works mostly
TobiasRoeddiger Feb 15, 2026
e0a1de2
fixed bug if two devices show as one
TobiasRoeddiger Feb 15, 2026
d6dae50
finalized heart beat tracker
TobiasRoeddiger Feb 15, 2026
5460a85
app improvements and more changes
TobiasRoeddiger Feb 16, 2026
70ab5cf
better show difference between applied and set profiles
TobiasRoeddiger Feb 16, 2026
a1c003b
handle mixed profiles more gracefully
TobiasRoeddiger Feb 16, 2026
7f0a910
fixed the auto reconnect
TobiasRoeddiger Feb 16, 2026
d066f0f
refinements for release
TobiasRoeddiger Feb 17, 2026
dacefd6
improve handling of profile states
TobiasRoeddiger Feb 17, 2026
13f115c
further tweaks, openring heart rate tracker app
TobiasRoeddiger Feb 17, 2026
02ff82f
fixed design issues on ios
TobiasRoeddiger Feb 17, 2026
12e24fc
fixed design issues on ios
TobiasRoeddiger Feb 17, 2026
2177823
improved ui updates interface
TobiasRoeddiger Feb 17, 2026
9502289
fixed problem relaed to graph reusage
TobiasRoeddiger Feb 17, 2026
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
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
package edu.kit.teco.openWearable

import android.content.Intent
import android.provider.Settings
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity()
class MainActivity : FlutterActivity() {
companion object {
private const val SYSTEM_SETTINGS_CHANNEL = "edu.kit.teco.open_wearable/system_settings"
}

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)

MethodChannel(
flutterEngine.dartExecutor.binaryMessenger,
SYSTEM_SETTINGS_CHANNEL,
).setMethodCallHandler { call, result ->
if (call.method == "openBluetoothSettings") {
try {
val intent = Intent(Settings.ACTION_BLUETOOTH_SETTINGS).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
}
startActivity(intent)
result.success(true)
} catch (_: Exception) {
result.success(false)
}
} else {
result.notImplemented()
}
}
}
}
66 changes: 64 additions & 2 deletions open_wearable/ios/Runner/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,40 @@ import UIKit

@main
@objc class AppDelegate: FlutterAppDelegate {
private var sensorShutdownBackgroundTask: UIBackgroundTaskIdentifier = .invalid
private var lifecycleChannel: FlutterMethodChannel?

private func beginSensorShutdownBackgroundTask() {
guard sensorShutdownBackgroundTask == .invalid else {
return
}

sensorShutdownBackgroundTask = UIApplication.shared.beginBackgroundTask(
withName: "SensorShutdown"
) { [weak self] in
self?.endSensorShutdownBackgroundTask()
}
}

private func endSensorShutdownBackgroundTask() {
guard sensorShutdownBackgroundTask != .invalid else {
return
}

UIApplication.shared.endBackgroundTask(sensorShutdownBackgroundTask)
sensorShutdownBackgroundTask = .invalid
}

override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
let channel = FlutterMethodChannel(name: "edu.teco.open_folder", binaryMessenger: controller.binaryMessenger)
let openFolderChannel = FlutterMethodChannel(name: "edu.teco.open_folder", binaryMessenger: controller.binaryMessenger)
let systemSettingsChannel = FlutterMethodChannel(name: "edu.kit.teco.open_wearable/system_settings", binaryMessenger: controller.binaryMessenger)
lifecycleChannel = FlutterMethodChannel(name: "edu.kit.teco.open_wearable/lifecycle", binaryMessenger: controller.binaryMessenger)

channel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
openFolderChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "openFolder", let args = call.arguments as? [String: Any], let path = args["path"] as? String {
guard let url = URL(string: path) else {
result(FlutterError(code: "INVALID_ARGUMENT", message: "Invalid folder path", details: nil))
Expand All @@ -27,6 +53,42 @@ import UIKit
}
}

systemSettingsChannel.setMethodCallHandler { (call: FlutterMethodCall, result: @escaping FlutterResult) in
if call.method == "openBluetoothSettings" {
guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else {
result(false)
return
}

if UIApplication.shared.canOpenURL(settingsUrl) {
UIApplication.shared.open(settingsUrl, options: [:]) { success in
result(success)
}
} else {
result(false)
}
} else {
result(FlutterMethodNotImplemented)
}
}

lifecycleChannel?.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) in
guard let self = self else {
result(false)
return
}

if call.method == "beginBackgroundExecution" {
self.beginSensorShutdownBackgroundTask()
result(true)
} else if call.method == "endBackgroundExecution" {
self.endSensorShutdownBackgroundTask()
result(true)
} else {
result(FlutterMethodNotImplemented)
}
}

GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading