feat: rename package to dev.fiatcode.tracpulse and app to TracPulse

- Update Android package namespace and applicationId to dev.fiatcode.tracpulse
- Update AndroidManifest.xml package and app label to TracPulse
- Move all Kotlin source files to dev/fiatcode/tracpulse/ package
- Update pubspec.yaml name to tracpulse
- Update all Dart imports from package:traccar_client to relative
- Rename TraccarClientApp class to TracPulseApp
- Update user-facing strings in permission_screen to TracPulse
- Update notification channel label and wakeLock tag to TracPulse
This commit is contained in:
fiatcode 2026-04-30 18:01:19 +07:00
parent b70822f2af
commit a5dd3323f5
No known key found for this signature in database
23 changed files with 74 additions and 73 deletions

View file

@ -6,7 +6,7 @@ plugins {
} }
android { android {
namespace = "com.traccar.traccar_client" namespace = "dev.fiatcode.tracpulse"
compileSdk = flutter.compileSdkVersion compileSdk = flutter.compileSdkVersion
ndkVersion = flutter.ndkVersion ndkVersion = flutter.ndkVersion
@ -22,7 +22,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId = "com.traccar.traccar_client" applicationId = "dev.fiatcode.tracpulse"
// You can update the following values to match your application needs. // You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config. // For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = flutter.minSdkVersion minSdk = flutter.minSdkVersion

View file

@ -1,4 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dev.fiatcode.tracpulse">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <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_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
@ -10,7 +11,7 @@
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<application <application
android:label="traccar_client" android:label="TracPulse"
android:name="${applicationName}" android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"> android:icon="@mipmap/ic_launcher">
<activity <activity

View file

@ -1,12 +1,12 @@
package com.traccar.traccar_client package dev.fiatcode.tracpulse
import android.content.Context import android.content.Context
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
import android.util.Log import android.util.Log
import com.traccar.traccar_client.service.LocationTrackingService import dev.fiatcode.tracpulse.service.LocationTrackingService
import com.traccar.traccar_client.storage.AppDatabase import dev.fiatcode.tracpulse.storage.AppDatabase
import io.flutter.embedding.engine.plugins.FlutterPlugin import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.plugin.common.EventChannel import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client package dev.fiatcode.tracpulse
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
@ -8,4 +8,4 @@ class MainActivity : FlutterActivity() {
super.configureFlutterEngine(flutterEngine) super.configureFlutterEngine(flutterEngine)
flutterEngine.plugins.add(BridgeModule()) flutterEngine.plugins.add(BridgeModule())
} }
} }

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.location package dev.fiatcode.tracpulse.location
import android.location.Location import android.location.Location
import kotlin.math.abs import kotlin.math.abs

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.location package dev.fiatcode.tracpulse.location
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
@ -66,4 +66,4 @@ class FusedLocationProvider(context: Context) {
else -> Priority.PRIORITY_BALANCED_POWER_ACCURACY else -> Priority.PRIORITY_BALANCED_POWER_ACCURACY
} }
} }
} }

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.location package dev.fiatcode.tracpulse.location
import android.app.AlarmManager import android.app.AlarmManager
import android.app.PendingIntent import android.app.PendingIntent
@ -84,7 +84,7 @@ class HeartbeatScheduler(private val context: Context) {
companion object { companion object {
private const val TAG = "HeartbeatScheduler" private const val TAG = "HeartbeatScheduler"
private const val ACTION_HEARTBEAT = "com.traccar.traccar_client.HEARTBEAT" private const val ACTION_HEARTBEAT = "dev.fiatcode.tracpulse.HEARTBEAT"
private const val REQUEST_CODE = 1001 private const val REQUEST_CODE = 1001
} }
} }

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.model package dev.fiatcode.tracpulse.model
data class EventLogEntry( data class EventLogEntry(
val id: Long = 0, val id: Long = 0,

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.model package dev.fiatcode.tracpulse.model
data class Location( data class Location(
val id: Long = 0, val id: Long = 0,

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.network package dev.fiatcode.tracpulse.network
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
@ -29,4 +29,4 @@ class ConnectivityReceiver(
return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) return capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
} }
} }
} }

View file

@ -1,7 +1,7 @@
package com.traccar.traccar_client.network package dev.fiatcode.tracpulse.network
import android.util.Base64 import android.util.Base64
import com.traccar.traccar_client.model.Location import dev.fiatcode.tracpulse.model.Location
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import okhttp3.MediaType import okhttp3.MediaType

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.service package dev.fiatcode.tracpulse.service
import android.app.Notification import android.app.Notification
import android.app.NotificationChannel import android.app.NotificationChannel
@ -16,19 +16,19 @@ import android.os.Build
import android.os.IBinder import android.os.IBinder
import android.os.PowerManager import android.os.PowerManager
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import com.traccar.traccar_client.BridgeModule import dev.fiatcode.tracpulse.BridgeModule
import com.traccar.traccar_client.MainActivity import dev.fiatcode.tracpulse.MainActivity
import com.traccar.traccar_client.R import dev.fiatcode.tracpulse.R
import com.traccar.traccar_client.location.DistanceFilterProcessor import dev.fiatcode.tracpulse.location.DistanceFilterProcessor
import com.traccar.traccar_client.location.FusedLocationProvider import dev.fiatcode.tracpulse.location.FusedLocationProvider
import com.traccar.traccar_client.location.HeartbeatScheduler import dev.fiatcode.tracpulse.location.HeartbeatScheduler
import com.traccar.traccar_client.model.Location as TraccarLocation import dev.fiatcode.tracpulse.model.Location as TraccarLocation
import com.traccar.traccar_client.network.ConnectivityReceiver import dev.fiatcode.tracpulse.network.ConnectivityReceiver
import com.traccar.traccar_client.network.TraccarConfig import dev.fiatcode.tracpulse.network.TraccarConfig
import com.traccar.traccar_client.network.TraccarHttpClient import dev.fiatcode.tracpulse.network.TraccarHttpClient
import com.traccar.traccar_client.storage.AppDatabase import dev.fiatcode.tracpulse.storage.AppDatabase
import com.traccar.traccar_client.storage.EventLogEntity import dev.fiatcode.tracpulse.storage.EventLogEntity
import com.traccar.traccar_client.storage.LocationEntity import dev.fiatcode.tracpulse.storage.LocationEntity
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.SupervisorJob
@ -214,7 +214,7 @@ class LocationTrackingService : Service() {
private fun onLocationReceived(location: Location) { private fun onLocationReceived(location: Location) {
val config = currentConfig ?: return val config = currentConfig ?: return
val filterConfig = com.traccar.traccar_client.location.FilterConfig( val filterConfig = dev.fiatcode.tracpulse.location.FilterConfig(
distanceFilter = config.distanceFilter, distanceFilter = config.distanceFilter,
intervalFilter = config.interval, intervalFilter = config.interval,
angleFilter = config.angleFilter angleFilter = config.angleFilter
@ -382,7 +382,7 @@ class LocationTrackingService : Service() {
) )
return NotificationCompat.Builder(this, CHANNEL_ID) return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("📍 Traccar Client") .setContentTitle("📍 TracPulse")
.setContentText(content) .setContentText(content)
.setSmallIcon(R.mipmap.ic_launcher) .setSmallIcon(R.mipmap.ic_launcher)
.setContentIntent(pendingIntent) .setContentIntent(pendingIntent)
@ -411,7 +411,7 @@ class LocationTrackingService : Service() {
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
wakeLock = powerManager.newWakeLock( wakeLock = powerManager.newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, PowerManager.PARTIAL_WAKE_LOCK,
"TraccarClient::LocationWakeLock" "TracPulse::LocationWakeLock"
).apply { ).apply {
acquire(10 * 60 * 60 * 1000L) // 10 hours max acquire(10 * 60 * 60 * 1000L) // 10 hours max
} }
@ -425,10 +425,10 @@ class LocationTrackingService : Service() {
} }
companion object { companion object {
const val ACTION_START = "com.traccar.traccar_client.ACTION_START" const val ACTION_START = "dev.fiatcode.tracpulse.ACTION_START"
const val ACTION_STOP = "com.traccar.traccar_client.ACTION_STOP" const val ACTION_STOP = "dev.fiatcode.tracpulse.ACTION_STOP"
const val ACTION_REPORT = "com.traccar.traccar_client.ACTION_REPORT" const val ACTION_REPORT = "dev.fiatcode.tracpulse.ACTION_REPORT"
private const val CHANNEL_ID = "traccar_tracking_channel" private const val CHANNEL_ID = "tracpulse_tracking_channel"
private const val NOTIFICATION_ID = 1 private const val NOTIFICATION_ID = 1
} }
} }
@ -445,4 +445,4 @@ data class TrackingConfig(
val heartbeat: Int = 60, val heartbeat: Int = 60,
val offlineBuffer: Boolean = true, val offlineBuffer: Boolean = true,
val stopDetection: Boolean = true val stopDetection: Boolean = true
) )

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.storage package dev.fiatcode.tracpulse.storage
import android.content.Context import android.content.Context
import androidx.room.Database import androidx.room.Database
@ -23,7 +23,7 @@ abstract class AppDatabase : RoomDatabase() {
val instance = Room.databaseBuilder( val instance = Room.databaseBuilder(
context.applicationContext, context.applicationContext,
AppDatabase::class.java, AppDatabase::class.java,
"traccar_client_db" "tracpulse_db"
).build() ).build()
INSTANCE = instance INSTANCE = instance
instance instance

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.storage package dev.fiatcode.tracpulse.storage
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.storage package dev.fiatcode.tracpulse.storage
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.storage package dev.fiatcode.tracpulse.storage
import androidx.room.Dao import androidx.room.Dao
import androidx.room.Insert import androidx.room.Insert

View file

@ -1,4 +1,4 @@
package com.traccar.traccar_client.storage package dev.fiatcode.tracpulse.storage
import androidx.room.Entity import androidx.room.Entity
import androidx.room.PrimaryKey import androidx.room.PrimaryKey

View file

@ -1,8 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:traccar_client/main_screen.dart'; import 'main_screen.dart';
import 'package:traccar_client/permission_screen.dart'; import 'permission_screen.dart';
import 'package:traccar_client/preferences.dart'; import 'preferences.dart';
void main() async { void main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
@ -16,16 +16,16 @@ void main() async {
), ),
); );
runApp(const TraccarClientApp()); runApp(const TracPulseApp());
} }
class TraccarClientApp extends StatelessWidget { class TracPulseApp extends StatelessWidget {
const TraccarClientApp({super.key}); const TracPulseApp({super.key});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( return MaterialApp(
title: 'Traccar Client', title: 'TracPulse',
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
theme: ThemeData( theme: ThemeData(
useMaterial3: true, useMaterial3: true,

View file

@ -1,10 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:traccar_client/bridge/location_bridge.dart'; import 'bridge/location_bridge.dart';
import 'package:traccar_client/preferences.dart'; import 'preferences.dart';
import 'package:traccar_client/settings_screen.dart'; import 'settings_screen.dart';
import 'package:traccar_client/status_screen.dart'; import 'status_screen.dart';
class MainScreen extends StatefulWidget { class MainScreen extends StatefulWidget {
const MainScreen({super.key}); const MainScreen({super.key});

View file

@ -1,9 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
import 'package:traccar_client/bridge/location_bridge.dart'; import 'bridge/location_bridge.dart';
import 'package:traccar_client/preferences.dart'; import 'preferences.dart';
import 'package:traccar_client/main_screen.dart'; import 'main_screen.dart';
class PermissionScreen extends StatefulWidget { class PermissionScreen extends StatefulWidget {
const PermissionScreen({super.key}); const PermissionScreen({super.key});
@ -131,8 +131,8 @@ class _PermissionScreenState extends State<PermissionScreen> {
content: Text( content: Text(
settingsOpened settingsOpened
? 'A settings screen has opened.\n\n' ? 'A settings screen has opened.\n\n'
'Find "Traccar Client" and set it to "Don\'t optimize" or "Unrestricted", then come back and tap CHECK & DONE.' 'Find "TracPulse" and set it to "Don\'t optimize" or "Unrestricted", then come back and tap CHECK & DONE.'
: 'Open Settings → Apps → Traccar Client → Battery and select "Don\'t optimize" or "Unrestricted", then come back and tap CHECK & DONE.', : 'Open Settings → Apps → TracPulse → Battery and select "Don\'t optimize" or "Unrestricted", then come back and tap CHECK & DONE.',
style: const TextStyle( style: const TextStyle(
fontFamily: 'monospace', fontFamily: 'monospace',
fontSize: 12, fontSize: 12,
@ -310,7 +310,7 @@ class _PermissionScreenState extends State<PermissionScreen> {
), ),
SizedBox(height: 4), SizedBox(height: 4),
Text( Text(
'Traccar Client needs these permissions to track your location reliably in the background.', 'TracPulse needs these permissions to track your location reliably in the background.',
style: TextStyle( style: TextStyle(
fontFamily: 'monospace', fontFamily: 'monospace',
fontSize: 11, fontSize: 11,

View file

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:traccar_client/bridge/location_bridge.dart'; import 'bridge/location_bridge.dart';
import 'package:traccar_client/preferences.dart'; import 'preferences.dart';
class SettingsScreen extends StatefulWidget { class SettingsScreen extends StatefulWidget {
const SettingsScreen({super.key}); const SettingsScreen({super.key});

View file

@ -1,4 +1,4 @@
name: traccar_client name: tracpulse
description: "A new Flutter project." description: "A new Flutter project."
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `flutter pub publish`. This is preferred for private packages. # pub.dev using `flutter pub publish`. This is preferred for private packages.

View file

@ -1,13 +1,13 @@
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:traccar_client/main.dart'; import 'package:tracpulse/main.dart';
void main() { void main() {
testWidgets('TraccarClientApp smoke test', (WidgetTester tester) async { testWidgets('TracPulse smoke test', (WidgetTester tester) async {
// Build our app and trigger a frame. // Build our app and trigger a frame.
await tester.pumpWidget(const TraccarClientApp()); await tester.pumpWidget(const TracPulseApp());
// Verify the app title is displayed // Verify the app title is displayed
expect(find.text('Traccar Client'), findsOneWidget); expect(find.text('TracPulse'), findsOneWidget);
}); });
} }