adaptive_location_tracker 0.0.2 copy "adaptive_location_tracker: ^0.0.2" to clipboard
adaptive_location_tracker: ^0.0.2 copied to clipboard

PlatformAndroid

A battery-efficient adaptive location tracker with offline sync, Kalman filtering, and foreground service support.

example/lib/main.dart

import 'package:flutter/material.dart';
import 'package:adaptive_location_tracker/adaptive_location_tracker.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(primarySwatch: Colors.deepPurple, useMaterial3: true),
      home: const TrackerHome(),
    );
  }
}

class TrackerHome extends StatefulWidget {
  const TrackerHome({super.key});

  @override
  State<TrackerHome> createState() => _TrackerHomeState();
}

class _TrackerHomeState extends State<TrackerHome> {
  final _urlController = TextEditingController(
    text: 'https://svhe.co.in/api/visits/start',
  );
  final _userIdController = TextEditingController(text: '101');
  bool _isTracking = false;
  bool _isWebSocket = false;
  String _statusLog = "Ready to track.";

  void _log(String message) {
    setState(() {
      _statusLog = "$message\n$_statusLog";
    });
  }

  Future<void> _toggleTracking() async {
    if (_isTracking) {
      await AdaptiveLocationTracker.stop();
      setState(() {
        _isTracking = false;
      });
      _log("🛑 Stopped Tracking");
    } else {
      _log("⏳ Starting...");
      try {
        final success = await AdaptiveLocationTracker.start(
          url: _urlController.text,
          headers: {
            'Authorization': 'Bearer SAMPLE_TOKEN_123',
            'Content-Type': 'application/json',
          },
          extraData: {
            'user_id': _userIdController.text,
            'app_version': '1.0.0',
            'platform': 'android',
          },
          notificationTitle: _isWebSocket
              ? "Live Socket Tracking"
              : "Field Visit Active",
          notificationText: "Tap to return to app",
          isWebSocket: _isWebSocket,
          intervalSeconds: 5, // Fast updates for testing
        );

        if (success) {
          setState(() {
            _isTracking = true;
          });
          _log(
            "✅ Started Successfully (${_isWebSocket ? 'WebSocket' : 'HTTP'})",
          );
        }
      } catch (e) {
        _log("❌ Error starting: $e");
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Adaptive Tracker Test'),
        actions: [
          IconButton(
            icon: const Icon(Icons.delete),
            onPressed: () => setState(() => _statusLog = ""),
          ),
        ],
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            // Configuration Card
            Card(
              elevation: 4,
              child: Padding(
                padding: const EdgeInsets.all(16.0),
                child: Column(
                  children: [
                    TextField(
                      controller: _urlController,
                      decoration: const InputDecoration(
                        labelText: 'API Endpoint / Socket URL',
                        border: OutlineInputBorder(),
                        prefixIcon: Icon(Icons.link),
                      ),
                    ),
                    const SizedBox(height: 10),
                    Row(
                      children: [
                        Expanded(
                          child: TextField(
                            controller: _userIdController,
                            decoration: const InputDecoration(
                              labelText: 'User ID (Extra Data)',
                              border: OutlineInputBorder(),
                              prefixIcon: Icon(Icons.person),
                            ),
                          ),
                        ),
                        const SizedBox(width: 10),
                        Column(
                          children: [
                            const Text("WebSocket"),
                            Switch(
                              value: _isWebSocket,
                              onChanged: (val) {
                                setState(() {
                                  _isWebSocket = val;
                                  // Auto-switch protocol prefix for convenience
                                  if (val &&
                                      _urlController.text.startsWith("http")) {
                                    _urlController.text = _urlController.text
                                        .replaceFirst("http", "ws");
                                  } else if (!val &&
                                      _urlController.text.startsWith("ws")) {
                                    _urlController.text = _urlController.text
                                        .replaceFirst("ws", "http");
                                  }
                                });
                              },
                            ),
                          ],
                        ),
                      ],
                    ),
                  ],
                ),
              ),
            ),

            const SizedBox(height: 20),

            // Action Button
            SizedBox(
              width: double.infinity,
              height: 50,
              child: ElevatedButton.icon(
                style: ElevatedButton.styleFrom(
                  backgroundColor: _isTracking ? Colors.red : Colors.green,
                  foregroundColor: Colors.white,
                ),
                onPressed: _toggleTracking,
                icon: Icon(_isTracking ? Icons.stop : Icons.play_arrow),
                label: Text(
                  _isTracking ? "STOP TRACKING" : "START TRACKING",
                  style: const TextStyle(
                    fontWeight: FontWeight.bold,
                    fontSize: 16,
                  ),
                ),
              ),
            ),

            const SizedBox(height: 20),
            const Align(
              alignment: Alignment.centerLeft,
              child: Text(
                "Event Log:",
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
            const Divider(),

            // Log output
            Expanded(
              child: Container(
                width: double.infinity,
                padding: const EdgeInsets.all(8),
                decoration: BoxDecoration(
                  color: Colors.grey[200],
                  borderRadius: BorderRadius.circular(8),
                  border: Border.all(color: Colors.grey[400]!),
                ),
                child: SingleChildScrollView(
                  child: Text(
                    _statusLog,
                    style: const TextStyle(
                      fontFamily: 'Monospace',
                      fontSize: 12,
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
4
likes
150
points
132
downloads

Publisher

unverified uploader

Weekly Downloads

A battery-efficient adaptive location tracker with offline sync, Kalman filtering, and foreground service support.

Repository (GitHub)

Documentation

API reference

License

MIT (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on adaptive_location_tracker

Packages that implement adaptive_location_tracker