AWTY Engine (Are We There Yet?)
A simple, reliable, and decoupled step tracking engine for Flutter applications. AWTY provides pure step counting and goal notification services, allowing you to focus on building your game's UI and logic.
Features
- Cross-Platform Support: Works on both Android and iOS with platform-optimized implementations
- Reliable Background Tracking:
- Android: Uses foreground service for continuous background operation
- iOS: Uses HealthKit background delivery for battery-efficient tracking
- Real Pedometer Integration: Connects to the device's native step sensors
- Simple API: Clean and focused API for starting, stopping, and monitoring step goals
- Customizable Notifications: Set custom notification text and icons (Android)
- Test Mode: Includes test mode for rapid development and testing
Platform Differences
Android
- Background Operation: Foreground service ensures reliable step counting
- Real-time Updates: Continuous step monitoring with persistent notification
- Battery Impact: Higher due to foreground service, but very reliable
- Best For: Users who want guaranteed step tracking reliability
iOS
- Background Operation: HealthKit background delivery wakes app when needed
- Update Frequency: Updates every 30-60 seconds when walking
- Battery Impact: Minimal - app sleeps most of the time
- Best For: Users who prioritize battery life and don't need real-time updates
Getting Started
1. Add Dependency
Add this to your package's pubspec.yaml file:
dependencies:
awty_engine: ^0.3.0
2. Platform Setup
Android Setup
Add the necessary permissions to your android/app/src/main/AndroidManifest.xml:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_HEALTH" />
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
<application ...>
...
</application>
</manifest>
Place your small, monochrome notification icon (e.g., barefoot.png) in the android/app/src/main/res/drawable directory.
iOS Setup
Add HealthKit capability to your iOS project:
- Open your iOS project in Xcode
- Select your target → Signing & Capabilities
- Add "HealthKit" capability
- Add privacy descriptions to
Info.plist:
<key>NSHealthShareUsageDescription</key>
<string>We need access to your health data to track your walking progress and notify you when goals are reached.</string>
<key>NSHealthUpdateUsageDescription</key>
<string>We need access to update your health data to track your walking progress.</string>
Usage
1. Initialize the Engine
In your main walking page's initState, initialize the AwtyEngine to listen for goal events:
import 'package:awty_engine/awty_engine.dart';
import 'package:pedometer/pedometer.dart';
import 'dart:async';
class WalkingPage extends StatefulWidget {
// ...
}
class _WalkingPageState extends State<WalkingPage> {
StreamSubscription<StepCount>? _stepCountSubscription;
@override
void initState() {
super.initState();
_initialize();
}
void _initialize() {
// Listen for goal reached events from AWTY
AwtyEngine.initialize();
AwtyEngine.onGoalReached = () {
print("Goal Reached! Navigating to the arrival page.");
// Navigate to your clue or arrival page here
};
// On Android: Listen to pedometer stream and forward to AWTY
// On iOS: HealthKit handles this automatically
if (defaultTargetPlatform == TargetPlatform.android) {
_stepCountSubscription = Pedometer.stepCountStream.listen(
(StepCount event) {
// Send live step counts to the AWTY service
AwtyEngine.updateStepCount(event.steps);
},
onError: (error) {
print("Pedometer Error: $error");
},
cancelOnError: true,
);
}
}
@override
void dispose() {
_stepCountSubscription?.cancel();
super.dispose();
}
// ... rest of your widget
}
2. Start a Walk
When you are ready to start a walk, call AwtyEngine.startTracking:
void startNewWalk() {
AwtyEngine.startTracking(
steps: 1000, // The number of steps for this goal
notificationText: "Walking to the Eiffel Tower...", // Android only
notificationIconName: 'barefoot', // Android only
testMode: false, // Set to true for 30-second test
);
}
3. Stop a Walk (Optional)
You can manually stop tracking at any time. The service will also stop itself automatically when a goal is reached:
void stopTheWalk() {
AwtyEngine.stopTracking();
}
Platform-Specific Behavior
Android
- Immediate Start: Step tracking begins immediately
- Real-time Progress: Progress updates with every step
- Persistent Notification: Status bar notification shows progress
- Background Reliability: Works even when app is closed
iOS
- HealthKit Integration: Uses Apple's Health app for step data
- Background Efficiency: App sleeps most of the time
- Update Frequency: Progress updates every 30-60 seconds when walking
- Battery Friendly: Minimal battery impact
API Reference
Methods
AwtyEngine.initialize()- Set up goal reached callbackAwtyEngine.startTracking(steps, notificationText?, notificationIconName?, testMode?)- Start tracking stepsAwtyEngine.stopTracking()- Stop trackingAwtyEngine.getProgress()- Get current progressAwtyEngine.updateStepCount(steps)- Update step count (Android only)
Properties
AwtyEngine.onGoalReached- Callback function for goal completion
Example Projects
Check out the example/ directory for complete working examples of both Android and iOS implementations.
Contributing
We welcome contributions! Please see our contributing guidelines for more information.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Support
For support and questions, please visit our GitHub repository or contact us at info@gamesafoot.co.
Libraries
- awty_engine
- AWTY Engine (Are We There Yet?)