Сравнить коммиты
| Автор | SHA1 | Дата | |
|---|---|---|---|
|
|
1dcc26b47b | ||
|
|
5580f0b6bf | ||
|
|
ddf1f0fbe0 | ||
|
|
235e58d3e2 | ||
|
|
9cdb10db14 | ||
|
|
745a8523ef | ||
|
|
a2b2c215da | ||
|
|
6d1c7b47e1 | ||
|
|
10bc96caf9 | ||
|
|
0873aa7302 | ||
|
|
37d3584f77 | ||
|
|
404886f80e | ||
|
|
a68b489681 | ||
|
|
04e5b01cc7 | ||
|
|
5f059645a1 | ||
|
|
8b985526dd | ||
|
|
5e8ea134e0 | ||
|
|
ec85edd56f | ||
|
|
c5ab10919e | ||
|
|
3e8ba9a603 | ||
|
|
826d638ea3 | ||
|
|
1b687bd075 | ||
|
|
42d5584d8d | ||
|
|
ff88682e40 | ||
|
|
307e692459 | ||
|
|
b7ec644ecf | ||
|
|
842baa2aec | ||
|
|
26bc92cf8e | ||
|
|
6dadf5e7c3 | ||
|
|
39e9c171c4 | ||
|
|
bcb5985cef | ||
|
|
eb868056bf | ||
|
|
94e094e648 | ||
|
|
25c0434e4c | ||
|
|
3afcfa17d0 | ||
|
|
02263d5fd9 | ||
|
|
a884b2f3d7 | ||
|
|
6910790fa7 | ||
|
|
6cab1a0b36 | ||
|
|
edd4f670fe | ||
|
|
298d7becb5 | ||
|
|
9a2e3f9126 | ||
|
|
d3f7ee0c8b | ||
|
|
8ae486dbc8 | ||
|
|
02295f5fcf | ||
|
|
958eb77c51 | ||
|
|
0a3a8381a5 | ||
|
|
6009dba342 | ||
|
|
59085f668c | ||
|
|
1cb5326e07 | ||
|
|
28befc6180 | ||
|
|
e83ef80fa3 | ||
|
|
b26a1bd133 | ||
|
|
0bbee716a6 | ||
|
|
52e3b839ae | ||
|
|
cfe04eb0a6 | ||
|
|
c243912c55 | ||
|
|
914a157afc | ||
|
|
454ce6be21 | ||
|
|
e8a1e015d4 | ||
|
|
ceb15c1378 | ||
|
|
d25c745013 | ||
|
|
c24df5b246 | ||
|
|
283d0467b4 | ||
|
|
83bf1daa84 | ||
|
|
96d61c4c66 | ||
|
|
3978a3d8d6 | ||
|
|
78018c3038 | ||
|
|
19b7c4da21 | ||
|
|
a3d43294ce | ||
|
|
330dc27f0f | ||
|
|
f052be83c3 | ||
|
|
c77d4b477b | ||
|
|
eb7de9eb98 | ||
|
|
3a786b14b7 | ||
|
|
6bad9786ec | ||
|
|
259aaf2000 | ||
|
|
aa00a33f5b | ||
|
|
ab86076b9b | ||
|
|
fed2a73999 | ||
|
|
42c210763c | ||
|
|
faa05dea5a | ||
|
|
453edfa97e | ||
|
|
4c6c79b6a2 | ||
|
|
93456bf7fb | ||
|
|
a2ff7fcb38 | ||
|
|
7015f75edb | ||
|
|
636ceaf027 | ||
|
|
350b800184 | ||
|
|
7ecba2cffd | ||
|
|
5d8f0dfb83 | ||
|
|
f42ecf9f09 | ||
|
|
556856ab5c | ||
|
|
f9f37ead08 | ||
|
|
b3ee99140e | ||
|
|
85f1e09308 | ||
|
|
20fd20f425 | ||
|
|
1ae7b27683 | ||
|
|
f5b12b9e74 | ||
|
|
d2f653034d | ||
|
|
ab5aec9721 | ||
|
|
1b0559c98a | ||
|
|
2e0e7ea453 | ||
|
|
ac6d677ff4 |
@@ -0,0 +1 @@
|
|||||||
|
custom: https://www.traccar.org/donate/
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
<!--
|
|
||||||
|
|
||||||
Do you want to ask a question? Traccar official forum is the best place for getting support:
|
|
||||||
|
|
||||||
https://www.traccar.org/forums/
|
|
||||||
|
|
||||||
-->
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
- Browser [e.g. chrome, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Smartphone (please complete the following information):**
|
||||||
|
- Device: [e.g. iPhone6]
|
||||||
|
- OS: [e.g. iOS8.1]
|
||||||
|
- Browser [e.g. stock browser, safari]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
+45
-24
@@ -1,29 +1,35 @@
|
|||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 28
|
compileSdkVersion 33
|
||||||
buildToolsVersion '28.0.2'
|
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.traccar.client"
|
applicationId 'org.traccar.client'
|
||||||
buildConfigField "boolean", "HIDDEN_APP", "false"
|
buildConfigField 'boolean', 'HIDDEN_APP', 'false'
|
||||||
minSdkVersion 15
|
minSdkVersion 16
|
||||||
targetSdkVersion 28
|
targetSdkVersion 33
|
||||||
versionCode 51
|
versionCode 80
|
||||||
versionName '5.14'
|
versionName '6.19'
|
||||||
|
multiDexEnabled true
|
||||||
|
}
|
||||||
|
namespace 'org.traccar.client'
|
||||||
|
|
||||||
|
packagingOptions {
|
||||||
|
resources {
|
||||||
|
excludes += ['META-INF/DEPENDENCIES']
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
lintOptions {
|
flavorDimensions 'default'
|
||||||
checkReleaseBuilds false
|
|
||||||
}
|
|
||||||
|
|
||||||
flavorDimensions "default"
|
|
||||||
productFlavors {
|
productFlavors {
|
||||||
regular
|
regular {
|
||||||
|
isDefault = true
|
||||||
|
}
|
||||||
google
|
google
|
||||||
hidden {
|
hidden {
|
||||||
applicationId "org.traccar.client.hidden"
|
applicationId 'org.traccar.client.hidden'
|
||||||
buildConfigField "boolean", "HIDDEN_APP", "true"
|
buildConfigField 'boolean', 'HIDDEN_APP', 'true'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,22 +38,37 @@ android {
|
|||||||
includeAndroidResources = true
|
includeAndroidResources = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lint {
|
||||||
|
checkReleaseBuilds false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation 'com.android.support:design:28.0.0-rc02'
|
implementation 'com.google.android.material:material:1.6.1' // wait for preference-ktx update
|
||||||
testImplementation 'junit:junit:4.12'
|
implementation 'androidx.multidex:multidex:2.0.1'
|
||||||
testImplementation 'org.robolectric:robolectric:3.8'
|
implementation 'androidx.preference:preference-ktx:1.2.0'
|
||||||
googleImplementation 'com.google.firebase:firebase-core:16.0.3'
|
implementation 'androidx.core:core-ktx:1.9.0'
|
||||||
googleImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.5'
|
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||||
|
implementation 'com.github.judemanutd:autostarter:1.1.0'
|
||||||
|
implementation('dev.doubledot.doki:library:0.0.1@aar') {
|
||||||
|
transitive = true
|
||||||
|
}
|
||||||
|
testImplementation 'junit:junit:4.13.2'
|
||||||
|
testImplementation 'org.robolectric:robolectric:4.7.3'
|
||||||
|
googleImplementation platform('com.google.firebase:firebase-bom:28.2.1')
|
||||||
|
googleImplementation 'com.google.firebase:firebase-core'
|
||||||
|
googleImplementation 'com.google.firebase:firebase-analytics'
|
||||||
|
googleImplementation 'com.google.firebase:firebase-crashlytics'
|
||||||
|
googleImplementation 'com.google.android.gms:play-services-location:21.0.1'
|
||||||
|
googleImplementation 'com.google.android.play:core:1.10.3'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getGradle().getStartParameter().getTaskRequests().toString().contains("Google")) {
|
if (getGradle().getStartParameter().getTaskRequests().toString().contains('Google')) {
|
||||||
apply plugin: 'com.google.gms.google-services'
|
apply plugin: 'com.google.gms.google-services'
|
||||||
apply plugin: 'io.fabric'
|
apply plugin: 'com.google.firebase.crashlytics'
|
||||||
|
|
||||||
task copyJson(type: Copy) {
|
task copyJson(type: Copy) {
|
||||||
from '../../traccar-shared/google-services'
|
from '../../environment/google-services'
|
||||||
into '.'
|
into '.'
|
||||||
include 'traccar-client-android.json'
|
include 'traccar-client-android.json'
|
||||||
rename('traccar-client-android.json', 'google-services.json')
|
rename('traccar-client-android.json', 'google-services.json')
|
||||||
|
|||||||
@@ -5,7 +5,8 @@
|
|||||||
|
|
||||||
<application
|
<application
|
||||||
android:name="org.traccar.client.GoogleMainApplication"
|
android:name="org.traccar.client.GoogleMainApplication"
|
||||||
tools:replace="android:name">
|
tools:replace="android:name"
|
||||||
|
tools:ignore="GoogleAppIndexingWarning">
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2017 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.app.Activity
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.os.Build
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.google.android.play.core.review.ReviewInfo
|
||||||
|
import com.google.android.play.core.review.ReviewManagerFactory
|
||||||
|
import com.google.android.play.core.tasks.Task
|
||||||
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
|
|
||||||
|
class GoogleMainApplication : MainApplication() {
|
||||||
|
|
||||||
|
private var firebaseAnalytics: FirebaseAnalytics? = null
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
firebaseAnalytics = FirebaseAnalytics.getInstance(this)
|
||||||
|
val filter = IntentFilter()
|
||||||
|
filter.addAction(TrackingService.ACTION_STARTED)
|
||||||
|
filter.addAction(TrackingService.ACTION_STOPPED)
|
||||||
|
registerReceiver(ServiceReceiver(), filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
|
||||||
|
override fun handleRatingFlow(activity: Activity) {
|
||||||
|
val preferences = PreferenceManager.getDefaultSharedPreferences(this)
|
||||||
|
val ratingShown = preferences.getBoolean(KEY_RATING_SHOWN, false)
|
||||||
|
val totalDuration = preferences.getLong(ServiceReceiver.KEY_DURATION, 0)
|
||||||
|
if (!ratingShown && totalDuration > RATING_THRESHOLD) {
|
||||||
|
val reviewManager = ReviewManagerFactory.create(activity)
|
||||||
|
reviewManager.requestReviewFlow().addOnCompleteListener { infoTask: Task<ReviewInfo?> ->
|
||||||
|
if (infoTask.isSuccessful) {
|
||||||
|
val flow = reviewManager.launchReviewFlow(activity, infoTask.result)
|
||||||
|
flow.addOnCompleteListener { preferences.edit().putBoolean(KEY_RATING_SHOWN, true).apply() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val KEY_RATING_SHOWN = "ratingShown"
|
||||||
|
private const val RATING_THRESHOLD = -24 * 60 * 60 * 1000L
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Looper
|
||||||
|
import com.google.android.gms.location.LocationCallback
|
||||||
|
import com.google.android.gms.location.LocationRequest
|
||||||
|
import com.google.android.gms.location.LocationResult
|
||||||
|
import com.google.android.gms.location.LocationServices
|
||||||
|
|
||||||
|
class GooglePositionProvider(context: Context, listener: PositionListener) : PositionProvider(context, listener) {
|
||||||
|
|
||||||
|
private val fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION", "MissingPermission")
|
||||||
|
override fun startUpdates() {
|
||||||
|
val locationRequest = LocationRequest()
|
||||||
|
locationRequest.priority = getPriority(preferences.getString(MainFragment.KEY_ACCURACY,"medium"))
|
||||||
|
locationRequest.interval = if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval
|
||||||
|
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper())
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun stopUpdates() {
|
||||||
|
fusedLocationClient.removeLocationUpdates(locationCallback)
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
override fun requestSingleLocation() {
|
||||||
|
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
|
||||||
|
if (location != null) {
|
||||||
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val locationCallback: LocationCallback = object : LocationCallback() {
|
||||||
|
override fun onLocationResult(locationResult: LocationResult) {
|
||||||
|
for (location in locationResult.locations) {
|
||||||
|
processLocation(location)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getPriority(accuracy: String?): Int {
|
||||||
|
return when (accuracy) {
|
||||||
|
"high" -> LocationRequest.PRIORITY_HIGH_ACCURACY
|
||||||
|
"low" -> LocationRequest.PRIORITY_LOW_POWER
|
||||||
|
else -> LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
-13
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
* Copyright 2019 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -13,20 +13,14 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.traccar.client;
|
package org.traccar.client
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.content.Context
|
||||||
import android.support.annotation.Nullable;
|
import org.traccar.client.PositionProvider.PositionListener
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity {
|
object PositionProviderFactory {
|
||||||
|
|
||||||
@Override
|
fun create(context: Context, listener: PositionListener): PositionProvider {
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
return GooglePositionProvider(context, listener)
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (savedInstanceState == null) {
|
|
||||||
getFragmentManager().beginTransaction().replace(android.R.id.content, new MainFragment()).commit();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
|
||||||
|
class ServiceReceiver : BroadcastReceiver() {
|
||||||
|
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
if (TrackingService.ACTION_STARTED == intent.action) {
|
||||||
|
startTime = System.currentTimeMillis()
|
||||||
|
} else if (startTime > 0) {
|
||||||
|
updateTime(context, System.currentTimeMillis() - startTime)
|
||||||
|
startTime = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun updateTime(context: Context, duration: Long) {
|
||||||
|
val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
val totalDuration = preferences.getLong(KEY_DURATION, 0)
|
||||||
|
preferences.edit().putLong(KEY_DURATION, totalDuration + duration).apply()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val KEY_DURATION = "serviceTime"
|
||||||
|
private var startTime: Long = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,7 +9,8 @@
|
|||||||
tools:replace="android:label">
|
tools:replace="android:label">
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name="org.traccar.client.MainActivity">
|
android:name="org.traccar.client.MainActivity"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter android:label="@string/app_name">
|
<intent-filter android:label="@string/app_name">
|
||||||
<action android:name="android.intent.action.VIEW" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
@@ -18,7 +19,9 @@
|
|||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<receiver android:name="org.traccar.client.DialLaunchReceiver" >
|
<receiver
|
||||||
|
android:name="org.traccar.client.DialLaunchReceiver"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
|
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.traccar.client.PositionProvider.PositionListener
|
||||||
|
|
||||||
|
object PositionProviderFactory {
|
||||||
|
|
||||||
|
fun create(context: Context, listener: PositionListener): PositionProvider {
|
||||||
|
return AndroidPositionProvider(context, listener)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest
|
<manifest
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.traccar.client">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
<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_FINE_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
||||||
@@ -12,13 +13,20 @@
|
|||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
|
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
|
||||||
|
|
||||||
|
<uses-permission android:name="oppo.permission.OPPO_COMPONENT_SAFE" />
|
||||||
|
<uses-permission android:name="com.huawei.permission.external_app_settings.USE_COMPONENT" />
|
||||||
|
|
||||||
|
<uses-feature android:name="android.hardware.location.network" />
|
||||||
|
<uses-feature android:name="android.hardware.location.gps" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:networkSecurityConfig="@xml/network_security_config"
|
android:networkSecurityConfig="@xml/network_security_config"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="@string/app_name"
|
android:label="@string/app_name"
|
||||||
android:theme="@style/AppTheme"
|
android:theme="@style/AppTheme"
|
||||||
android:name=".MainApplication">
|
android:name=".MainApplication"
|
||||||
|
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
|
||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="google_analytics_adid_collection_enabled"
|
android:name="google_analytics_adid_collection_enabled"
|
||||||
@@ -26,10 +34,12 @@
|
|||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
|
android:exported="true"
|
||||||
android:launchMode="singleTask" />
|
android:launchMode="singleTask" />
|
||||||
|
|
||||||
<activity-alias
|
<activity-alias
|
||||||
android:name=".Launcher"
|
android:name=".Launcher"
|
||||||
|
android:exported="true"
|
||||||
android:targetActivity=".MainActivity">
|
android:targetActivity=".MainActivity">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
@@ -40,24 +50,34 @@
|
|||||||
android:resource="@xml/shortcuts" />
|
android:resource="@xml/shortcuts" />
|
||||||
</activity-alias>
|
</activity-alias>
|
||||||
|
|
||||||
<activity android:name=".StatusActivity"/>
|
<activity
|
||||||
|
android:name=".StatusActivity"
|
||||||
<activity android:name=".AboutActivity"/>
|
android:exported="false" />
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ShortcutActivity"
|
android:name=".ShortcutActivity"
|
||||||
|
android:exported="true"
|
||||||
android:label="@string/menu_shortcuts">
|
android:label="@string/menu_shortcuts">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.CREATE_SHORTCUT" />
|
<action android:name="android.intent.action.CREATE_SHORTCUT" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<service android:name=".TrackingService" />
|
<service
|
||||||
|
android:name=".TrackingService"
|
||||||
|
android:exported="false"
|
||||||
|
android:foregroundServiceType="location" />
|
||||||
|
|
||||||
<service android:name=".TrackingService$HideNotificationService" />
|
<service
|
||||||
|
android:name=".TrackingService$HideNotificationService"
|
||||||
|
android:exported="false" />
|
||||||
|
|
||||||
<receiver android:name=".AutostartReceiver">
|
<receiver
|
||||||
|
android:name=".AutostartReceiver"
|
||||||
|
android:exported="true">
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|||||||
Двоичные данные
Двоичный файл не отображается.
|
До Ширина: | Высота: | Размер: 48 KiB После Ширина: | Высота: | Размер: 26 KiB |
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.pm.PackageManager.NameNotFoundException;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
public class AboutActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.about);
|
|
||||||
|
|
||||||
TextView title = findViewById(R.id.title);
|
|
||||||
try {
|
|
||||||
title.setText(title.getText() + " " + getPackageManager().getPackageInfo(this.getPackageName(), 0).versionName);
|
|
||||||
} catch (NameNotFoundException e) {
|
|
||||||
Log.w(AboutActivity.class.getSimpleName(), e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.Context
|
||||||
|
import android.location.Location
|
||||||
|
import android.location.LocationListener
|
||||||
|
import android.location.LocationManager
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.os.Looper
|
||||||
|
|
||||||
|
class AndroidPositionProvider(context: Context, listener: PositionListener) : PositionProvider(context, listener), LocationListener {
|
||||||
|
|
||||||
|
private val locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
|
||||||
|
private val provider = getProvider(preferences.getString(MainFragment.KEY_ACCURACY, "medium"))
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
|
override fun startUpdates() {
|
||||||
|
try {
|
||||||
|
locationManager.requestLocationUpdates(
|
||||||
|
provider, if (distance > 0 || angle > 0) MINIMUM_INTERVAL else interval, 0f, this)
|
||||||
|
} catch (e: RuntimeException) {
|
||||||
|
listener.onPositionError(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun stopUpdates() {
|
||||||
|
locationManager.removeUpdates(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION", "MissingPermission")
|
||||||
|
override fun requestSingleLocation() {
|
||||||
|
try {
|
||||||
|
val location = locationManager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER)
|
||||||
|
if (location != null) {
|
||||||
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
|
} else {
|
||||||
|
locationManager.requestSingleUpdate(provider, object : LocationListener {
|
||||||
|
override fun onLocationChanged(location: Location) {
|
||||||
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
|
||||||
|
override fun onProviderEnabled(provider: String) {}
|
||||||
|
override fun onProviderDisabled(provider: String) {}
|
||||||
|
}, Looper.myLooper())
|
||||||
|
}
|
||||||
|
} catch (e: RuntimeException) {
|
||||||
|
listener.onPositionError(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onLocationChanged(location: Location) {
|
||||||
|
processLocation(location)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStatusChanged(provider: String, status: Int, extras: Bundle) {}
|
||||||
|
override fun onProviderEnabled(provider: String) {}
|
||||||
|
override fun onProviderDisabled(provider: String) {}
|
||||||
|
|
||||||
|
private fun getProvider(accuracy: String?): String {
|
||||||
|
return when (accuracy) {
|
||||||
|
"high" -> LocationManager.GPS_PROVIDER
|
||||||
|
"low" -> LocationManager.PASSIVE_PROVIDER
|
||||||
|
else -> LocationManager.NETWORK_PROVIDER
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+10
-11
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2013 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
* Copyright 2013 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -13,20 +13,19 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.traccar.client;
|
package org.traccar.client
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context
|
||||||
import android.content.Intent;
|
import android.content.Intent
|
||||||
import android.content.SharedPreferences;
|
import androidx.preference.PreferenceManager
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
|
|
||||||
public class AutostartReceiver extends WakefulBroadcastReceiver {
|
class AutostartReceiver : WakefulBroadcastReceiver() {
|
||||||
|
|
||||||
@Override
|
@Suppress("UnsafeProtectedBroadcastReceiver")
|
||||||
public void onReceive(Context context, Intent intent) {
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
|
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
if (sharedPreferences.getBoolean(MainFragment.KEY_STATUS, false)) {
|
if (sharedPreferences.getBoolean(MainFragment.KEY_STATUS, false)) {
|
||||||
startWakefulForegroundService(context, new Intent(context, TrackingService.class));
|
startWakefulForegroundService(context, Intent(context, TrackingService::class.java))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.ActivityNotFoundException
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.provider.Settings
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import com.judemanutd.autostarter.AutoStartPermissionHelper
|
||||||
|
|
||||||
|
class BatteryOptimizationHelper {
|
||||||
|
|
||||||
|
private fun showDialog(context: Context, onSuccess: () -> Unit) {
|
||||||
|
val builder = AlertDialog.Builder(context)
|
||||||
|
builder.setMessage(context.getString(R.string.request_exception))
|
||||||
|
builder.setPositiveButton(android.R.string.ok) { _, _ -> onSuccess() }
|
||||||
|
builder.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
builder.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requestVendorException(context: Context) {
|
||||||
|
val vendorIntentList = listOf(
|
||||||
|
Intent().setComponent(ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.letv.android.letvsafe", "com.letv.android.letvsafe.AutobootManageActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.coloros.safecenter", "com.coloros.safecenter.startupapp.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.oppo.safe", "com.oppo.safe.permission.startup.StartupAppListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.iqoo.secure", "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager")),
|
||||||
|
Intent().setComponent(ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.samsung.android.lool", "com.samsung.android.sm.ui.battery.BatteryActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.htc.pitroad", "com.htc.pitroad.landingpage.activity.LandingPageActivity")),
|
||||||
|
Intent().setComponent(ComponentName("com.asus.mobilemanager", "com.asus.mobilemanager.MainActivity")),
|
||||||
|
)
|
||||||
|
for (vendorIntent in vendorIntentList) {
|
||||||
|
if (context.packageManager.resolveActivity(vendorIntent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
|
||||||
|
try {
|
||||||
|
context.startActivity(vendorIntent)
|
||||||
|
return
|
||||||
|
} catch (e: Exception) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun requestException(context: Context): Boolean {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
if (!sharedPreferences.getBoolean(KEY_EXCEPTION_REQUESTED, false)) {
|
||||||
|
sharedPreferences.edit().putBoolean(KEY_EXCEPTION_REQUESTED, true).apply()
|
||||||
|
val powerManager = context.getSystemService(PowerManager::class.java)
|
||||||
|
if (!powerManager.isIgnoringBatteryOptimizations(context.packageName)) {
|
||||||
|
showDialog(context) {
|
||||||
|
try {
|
||||||
|
context.startActivity(Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS))
|
||||||
|
} catch (e: ActivityNotFoundException) {
|
||||||
|
requestVendorException(context)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else if (!sharedPreferences.getBoolean(KEY_AUTOSTART_REQUESTED, false)) {
|
||||||
|
sharedPreferences.edit().putBoolean(KEY_AUTOSTART_REQUESTED, true).apply()
|
||||||
|
try {
|
||||||
|
if (AutoStartPermissionHelper.getInstance().getAutoStartPermission(context)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} catch (e: SecurityException) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val KEY_EXCEPTION_REQUESTED = "exceptionRequested"
|
||||||
|
private const val KEY_AUTOSTART_REQUESTED = "autostartRequested"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
data class BatteryStatus(
|
||||||
|
val level: Double = 0.0,
|
||||||
|
val charging: Boolean = false,
|
||||||
|
)
|
||||||
@@ -1,180 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.database.SQLException;
|
|
||||||
import android.database.sqlite.SQLiteDatabase;
|
|
||||||
import android.database.sqlite.SQLiteOpenHelper;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
public class DatabaseHelper extends SQLiteOpenHelper {
|
|
||||||
|
|
||||||
public static final int DATABASE_VERSION = 3;
|
|
||||||
public static final String DATABASE_NAME = "traccar.db";
|
|
||||||
|
|
||||||
public interface DatabaseHandler<T> {
|
|
||||||
void onComplete(boolean success, T result);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static abstract class DatabaseAsyncTask<T> extends AsyncTask<Void, Void, T> {
|
|
||||||
|
|
||||||
private DatabaseHandler<T> handler;
|
|
||||||
private RuntimeException error;
|
|
||||||
|
|
||||||
public DatabaseAsyncTask(DatabaseHandler<T> handler) {
|
|
||||||
this.handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected T doInBackground(Void... params) {
|
|
||||||
try {
|
|
||||||
return executeMethod();
|
|
||||||
} catch (RuntimeException error) {
|
|
||||||
this.error = error;
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract T executeMethod();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(T result) {
|
|
||||||
handler.onComplete(error == null, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private SQLiteDatabase db;
|
|
||||||
|
|
||||||
public DatabaseHelper(Context context) {
|
|
||||||
super(context, DATABASE_NAME, null, DATABASE_VERSION);
|
|
||||||
db = getWritableDatabase();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(SQLiteDatabase db) {
|
|
||||||
db.execSQL("CREATE TABLE position (" +
|
|
||||||
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
|
|
||||||
"deviceId TEXT," +
|
|
||||||
"time INTEGER," +
|
|
||||||
"latitude REAL," +
|
|
||||||
"longitude REAL," +
|
|
||||||
"altitude REAL," +
|
|
||||||
"speed REAL," +
|
|
||||||
"course REAL," +
|
|
||||||
"accuracy REAL," +
|
|
||||||
"battery REAL," +
|
|
||||||
"mock INTEGER)");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
|
||||||
db.execSQL("DROP TABLE IF EXISTS position;");
|
|
||||||
onCreate(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
|
|
||||||
db.execSQL("DROP TABLE IF EXISTS position;");
|
|
||||||
onCreate(db);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void insertPosition(Position position) {
|
|
||||||
ContentValues values = new ContentValues();
|
|
||||||
values.put("deviceId", position.getDeviceId());
|
|
||||||
values.put("time", position.getTime().getTime());
|
|
||||||
values.put("latitude", position.getLatitude());
|
|
||||||
values.put("longitude", position.getLongitude());
|
|
||||||
values.put("altitude", position.getAltitude());
|
|
||||||
values.put("speed", position.getSpeed());
|
|
||||||
values.put("course", position.getCourse());
|
|
||||||
values.put("accuracy", position.getAccuracy());
|
|
||||||
values.put("battery", position.getBattery());
|
|
||||||
values.put("mock", position.getMock() ? 1 : 0);
|
|
||||||
|
|
||||||
db.insertOrThrow("position", null, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void insertPositionAsync(final Position position, DatabaseHandler<Void> handler) {
|
|
||||||
new DatabaseAsyncTask<Void>(handler) {
|
|
||||||
@Override
|
|
||||||
protected Void executeMethod() {
|
|
||||||
insertPosition(position);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}.execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Position selectPosition() {
|
|
||||||
Position position = new Position();
|
|
||||||
|
|
||||||
Cursor cursor = db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null);
|
|
||||||
try {
|
|
||||||
if (cursor.getCount() > 0) {
|
|
||||||
|
|
||||||
cursor.moveToFirst();
|
|
||||||
|
|
||||||
position.setId(cursor.getLong(cursor.getColumnIndex("id")));
|
|
||||||
position.setDeviceId(cursor.getString(cursor.getColumnIndex("deviceId")));
|
|
||||||
position.setTime(new Date(cursor.getLong(cursor.getColumnIndex("time"))));
|
|
||||||
position.setLatitude(cursor.getDouble(cursor.getColumnIndex("latitude")));
|
|
||||||
position.setLongitude(cursor.getDouble(cursor.getColumnIndex("longitude")));
|
|
||||||
position.setAltitude(cursor.getDouble(cursor.getColumnIndex("altitude")));
|
|
||||||
position.setSpeed(cursor.getDouble(cursor.getColumnIndex("speed")));
|
|
||||||
position.setCourse(cursor.getDouble(cursor.getColumnIndex("course")));
|
|
||||||
position.setAccuracy(cursor.getDouble(cursor.getColumnIndex("accuracy")));
|
|
||||||
position.setBattery(cursor.getDouble(cursor.getColumnIndex("battery")));
|
|
||||||
position.setMock(cursor.getInt(cursor.getColumnIndex("mock")) > 0);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
cursor.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
return position;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void selectPositionAsync(DatabaseHandler<Position> handler) {
|
|
||||||
new DatabaseAsyncTask<Position>(handler) {
|
|
||||||
@Override
|
|
||||||
protected Position executeMethod() {
|
|
||||||
return selectPosition();
|
|
||||||
}
|
|
||||||
}.execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deletePosition(long id) {
|
|
||||||
if (db.delete("position", "id = ?", new String[] { String.valueOf(id) }) != 1) {
|
|
||||||
throw new SQLException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void deletePositionAsync(final long id, DatabaseHandler<Void> handler) {
|
|
||||||
new DatabaseAsyncTask<Void>(handler) {
|
|
||||||
@Override
|
|
||||||
protected Void executeMethod() {
|
|
||||||
deletePosition(id);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}.execute();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION", "StaticFieldLeak")
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.content.ContentValues
|
||||||
|
import android.content.Context
|
||||||
|
import android.database.SQLException
|
||||||
|
import android.database.sqlite.SQLiteDatabase
|
||||||
|
import android.database.sqlite.SQLiteOpenHelper
|
||||||
|
import android.os.AsyncTask
|
||||||
|
import java.sql.Date
|
||||||
|
|
||||||
|
class DatabaseHelper(context: Context?) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
|
||||||
|
|
||||||
|
interface DatabaseHandler<T> {
|
||||||
|
fun onComplete(success: Boolean, result: T)
|
||||||
|
}
|
||||||
|
|
||||||
|
private abstract class DatabaseAsyncTask<T>(val handler: DatabaseHandler<T?>) : AsyncTask<Unit, Unit, T?>() {
|
||||||
|
|
||||||
|
private var error: RuntimeException? = null
|
||||||
|
|
||||||
|
override fun doInBackground(vararg params: Unit): T? {
|
||||||
|
return try {
|
||||||
|
executeMethod()
|
||||||
|
} catch (error: RuntimeException) {
|
||||||
|
this.error = error
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract fun executeMethod(): T
|
||||||
|
|
||||||
|
override fun onPostExecute(result: T?) {
|
||||||
|
handler.onComplete(error == null, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val db: SQLiteDatabase = writableDatabase
|
||||||
|
|
||||||
|
override fun onCreate(db: SQLiteDatabase) {
|
||||||
|
db.execSQL(
|
||||||
|
"CREATE TABLE position (" +
|
||||||
|
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
|
||||||
|
"deviceId TEXT," +
|
||||||
|
"time INTEGER," +
|
||||||
|
"latitude REAL," +
|
||||||
|
"longitude REAL," +
|
||||||
|
"altitude REAL," +
|
||||||
|
"speed REAL," +
|
||||||
|
"course REAL," +
|
||||||
|
"accuracy REAL," +
|
||||||
|
"battery REAL," +
|
||||||
|
"charging INTEGER," +
|
||||||
|
"mock INTEGER)"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS position;")
|
||||||
|
onCreate(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDowngrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
|
||||||
|
db.execSQL("DROP TABLE IF EXISTS position;")
|
||||||
|
onCreate(db)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun insertPosition(position: Position) {
|
||||||
|
val values = ContentValues()
|
||||||
|
values.put("deviceId", position.deviceId)
|
||||||
|
values.put("time", position.time.time)
|
||||||
|
values.put("latitude", position.latitude)
|
||||||
|
values.put("longitude", position.longitude)
|
||||||
|
values.put("altitude", position.altitude)
|
||||||
|
values.put("speed", position.speed)
|
||||||
|
values.put("course", position.course)
|
||||||
|
values.put("accuracy", position.accuracy)
|
||||||
|
values.put("battery", position.battery)
|
||||||
|
values.put("charging", if (position.charging) 1 else 0)
|
||||||
|
values.put("mock", if (position.mock) 1 else 0)
|
||||||
|
db.insertOrThrow("position", null, values)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun insertPositionAsync(position: Position, handler: DatabaseHandler<Unit?>) {
|
||||||
|
object : DatabaseAsyncTask<Unit>(handler) {
|
||||||
|
override fun executeMethod() {
|
||||||
|
insertPosition(position)
|
||||||
|
}
|
||||||
|
}.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("Range")
|
||||||
|
fun selectPosition(): Position? {
|
||||||
|
db.rawQuery("SELECT * FROM position ORDER BY id LIMIT 1", null).use { cursor ->
|
||||||
|
if (cursor.count > 0) {
|
||||||
|
cursor.moveToFirst()
|
||||||
|
return Position(
|
||||||
|
id = cursor.getLong(cursor.getColumnIndex("id")),
|
||||||
|
deviceId = cursor.getString(cursor.getColumnIndex("deviceId")),
|
||||||
|
time = Date(cursor.getLong(cursor.getColumnIndex("time"))),
|
||||||
|
latitude = cursor.getDouble(cursor.getColumnIndex("latitude")),
|
||||||
|
longitude = cursor.getDouble(cursor.getColumnIndex("longitude")),
|
||||||
|
altitude = cursor.getDouble(cursor.getColumnIndex("altitude")),
|
||||||
|
speed = cursor.getDouble(cursor.getColumnIndex("speed")),
|
||||||
|
course = cursor.getDouble(cursor.getColumnIndex("course")),
|
||||||
|
accuracy = cursor.getDouble(cursor.getColumnIndex("accuracy")),
|
||||||
|
battery = cursor.getDouble(cursor.getColumnIndex("battery")),
|
||||||
|
charging = cursor.getInt(cursor.getColumnIndex("charging")) > 0,
|
||||||
|
mock = cursor.getInt(cursor.getColumnIndex("mock")) > 0,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
fun selectPositionAsync(handler: DatabaseHandler<Position?>) {
|
||||||
|
object : DatabaseAsyncTask<Position?>(handler) {
|
||||||
|
override fun executeMethod(): Position? {
|
||||||
|
return selectPosition()
|
||||||
|
}
|
||||||
|
}.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deletePosition(id: Long) {
|
||||||
|
if (db.delete("position", "id = ?", arrayOf(id.toString())) != 1) {
|
||||||
|
throw SQLException()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun deletePositionAsync(id: Long, handler: DatabaseHandler<Unit?>) {
|
||||||
|
object : DatabaseAsyncTask<Unit>(handler) {
|
||||||
|
override fun executeMethod() {
|
||||||
|
deletePosition(id)
|
||||||
|
}
|
||||||
|
}.execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val DATABASE_VERSION = 4
|
||||||
|
const val DATABASE_NAME = "traccar.db"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
|
|
||||||
public class DialLaunchReceiver extends BroadcastReceiver {
|
|
||||||
|
|
||||||
private static final String LAUNCHER_NUMBER = "8722227"; // TRACCAR
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
|
|
||||||
if (phoneNumber.equals(LAUNCHER_NUMBER)) {
|
|
||||||
setResultData(null);
|
|
||||||
Intent appIntent = new Intent(context, MainActivity.class);
|
|
||||||
appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
|
||||||
context.startActivity(appIntent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
|
||||||
|
class DialLaunchReceiver : BroadcastReceiver() {
|
||||||
|
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
val phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)
|
||||||
|
if (phoneNumber == LAUNCHER_NUMBER) {
|
||||||
|
resultData = null
|
||||||
|
val appIntent = Intent(context, MainActivity::class.java)
|
||||||
|
appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
|
context.startActivity(appIntent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val LAUNCHER_NUMBER = "8722227" // TRACCAR
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+8
-10
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
* Copyright 2017 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -13,18 +13,16 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
package org.traccar.client;
|
package org.traccar.client
|
||||||
|
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics;
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import android.os.Bundle
|
||||||
|
|
||||||
public class GoogleMainApplication extends MainApplication {
|
class MainActivity : AppCompatActivity() {
|
||||||
|
|
||||||
private FirebaseAnalytics firebaseAnalytics;
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
@Override
|
setContentView(R.layout.main)
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
firebaseAnalytics = FirebaseAnalytics.getInstance(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.app.Application;
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationChannel;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.graphics.Color;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
|
|
||||||
public class MainApplication extends Application {
|
|
||||||
|
|
||||||
public static final String PRIMARY_CHANNEL = "default";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
super.onCreate();
|
|
||||||
System.setProperty("http.keepAliveDuration", String.valueOf(30 * 60 * 1000));
|
|
||||||
|
|
||||||
migrateLegacyPreferences(PreferenceManager.getDefaultSharedPreferences(this));
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
registerChannel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.O)
|
|
||||||
private void registerChannel() {
|
|
||||||
NotificationChannel channel = new NotificationChannel(
|
|
||||||
PRIMARY_CHANNEL, getString(R.string.channel_default), NotificationManager.IMPORTANCE_MIN);
|
|
||||||
channel.setLightColor(Color.GREEN);
|
|
||||||
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
|
|
||||||
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void migrateLegacyPreferences(SharedPreferences preferences) {
|
|
||||||
String port = preferences.getString("port", null);
|
|
||||||
if (port != null) {
|
|
||||||
String host = preferences.getString("address", getString(R.string.settings_url_default_value));
|
|
||||||
String scheme = preferences.getBoolean("secure", false) ? "https" : "http";
|
|
||||||
|
|
||||||
Uri.Builder builder = new Uri.Builder();
|
|
||||||
builder.scheme(scheme).encodedAuthority(host + ":" + port).build();
|
|
||||||
SharedPreferences.Editor editor = preferences.edit();
|
|
||||||
editor.putString(MainFragment.KEY_URL, builder.toString());
|
|
||||||
|
|
||||||
editor.remove("port");
|
|
||||||
editor.remove("address");
|
|
||||||
editor.remove("secure");
|
|
||||||
editor.apply();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import androidx.multidex.MultiDexApplication
|
||||||
|
import android.annotation.TargetApi
|
||||||
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.app.Notification
|
||||||
|
import android.graphics.Color
|
||||||
|
import android.os.Build
|
||||||
|
import android.app.Activity
|
||||||
|
|
||||||
|
open class MainApplication : MultiDexApplication() {
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
System.setProperty("http.keepAliveDuration", (30 * 60 * 1000).toString())
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
registerChannel()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.O)
|
||||||
|
private fun registerChannel() {
|
||||||
|
val channel = NotificationChannel(
|
||||||
|
PRIMARY_CHANNEL, getString(R.string.channel_default), NotificationManager.IMPORTANCE_LOW
|
||||||
|
)
|
||||||
|
channel.lightColor = Color.GREEN
|
||||||
|
channel.lockscreenVisibility = Notification.VISIBILITY_SECRET
|
||||||
|
(getSystemService(NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
open fun handleRatingFlow(activity: Activity) {}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val PRIMARY_CHANNEL = "default"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,278 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.Manifest;
|
|
||||||
import android.app.AlarmManager;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.ComponentName;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.preference.CheckBoxPreference;
|
|
||||||
import android.preference.EditTextPreference;
|
|
||||||
import android.preference.Preference;
|
|
||||||
import android.preference.PreferenceFragment;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.preference.TwoStatePreference;
|
|
||||||
import android.support.annotation.NonNull;
|
|
||||||
import android.support.v4.content.ContextCompat;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.webkit.URLUtil;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class MainFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {
|
|
||||||
|
|
||||||
private static final String TAG = MainFragment.class.getSimpleName();
|
|
||||||
|
|
||||||
private static final int ALARM_MANAGER_INTERVAL = 15000;
|
|
||||||
|
|
||||||
public static final String KEY_DEVICE = "id";
|
|
||||||
public static final String KEY_URL = "url";
|
|
||||||
public static final String KEY_INTERVAL = "interval";
|
|
||||||
public static final String KEY_DISTANCE = "distance";
|
|
||||||
public static final String KEY_ANGLE = "angle";
|
|
||||||
public static final String KEY_ACCURACY = "accuracy";
|
|
||||||
public static final String KEY_STATUS = "status";
|
|
||||||
|
|
||||||
private static final int PERMISSIONS_REQUEST_LOCATION = 2;
|
|
||||||
|
|
||||||
private SharedPreferences sharedPreferences;
|
|
||||||
|
|
||||||
private AlarmManager alarmManager;
|
|
||||||
private PendingIntent alarmIntent;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (BuildConfig.HIDDEN_APP) {
|
|
||||||
removeLauncherIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
setHasOptionsMenu(true);
|
|
||||||
|
|
||||||
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
|
||||||
addPreferencesFromResource(R.xml.preferences);
|
|
||||||
initPreferences();
|
|
||||||
|
|
||||||
findPreference(KEY_DEVICE).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
return newValue != null && !newValue.equals("");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
findPreference(KEY_URL).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
return (newValue != null) && validateServerURL(newValue.toString());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
findPreference(KEY_INTERVAL).setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
if (newValue != null) {
|
|
||||||
try {
|
|
||||||
int value = Integer.parseInt((String) newValue);
|
|
||||||
return value > 0;
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
Log.w(TAG, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Preference.OnPreferenceChangeListener numberValidationListener = new Preference.OnPreferenceChangeListener() {
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
|
||||||
if (newValue != null) {
|
|
||||||
try {
|
|
||||||
int value = Integer.parseInt((String) newValue);
|
|
||||||
return value >= 0;
|
|
||||||
} catch (NumberFormatException e) {
|
|
||||||
Log.w(TAG, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
findPreference(KEY_DISTANCE).setOnPreferenceChangeListener(numberValidationListener);
|
|
||||||
findPreference(KEY_ANGLE).setOnPreferenceChangeListener(numberValidationListener);
|
|
||||||
|
|
||||||
alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
|
|
||||||
alarmIntent = PendingIntent.getBroadcast(getActivity(), 0, new Intent(getActivity(), AutostartReceiver.class), 0);
|
|
||||||
|
|
||||||
if (sharedPreferences.getBoolean(KEY_STATUS, false)) {
|
|
||||||
startTrackingService(true, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void removeLauncherIcon() {
|
|
||||||
String className = MainActivity.class.getCanonicalName().replace(".MainActivity", ".Launcher");
|
|
||||||
ComponentName componentName = new ComponentName(getActivity().getPackageName(), className);
|
|
||||||
PackageManager packageManager = getActivity().getPackageManager();
|
|
||||||
if (packageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
|
|
||||||
packageManager.setComponentEnabledSetting(
|
|
||||||
componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
|
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
||||||
builder.setIcon(android.R.drawable.ic_dialog_alert);
|
|
||||||
builder.setMessage(getString(R.string.hidden_alert));
|
|
||||||
builder.setPositiveButton(android.R.string.ok, null);
|
|
||||||
builder.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
super.onResume();
|
|
||||||
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPause() {
|
|
||||||
super.onPause();
|
|
||||||
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setPreferencesEnabled(boolean enabled) {
|
|
||||||
findPreference(KEY_DEVICE).setEnabled(enabled);
|
|
||||||
findPreference(KEY_URL).setEnabled(enabled);
|
|
||||||
findPreference(KEY_INTERVAL).setEnabled(enabled);
|
|
||||||
findPreference(KEY_DISTANCE).setEnabled(enabled);
|
|
||||||
findPreference(KEY_ANGLE).setEnabled(enabled);
|
|
||||||
findPreference(KEY_ACCURACY).setEnabled(enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
|
|
||||||
if (key.equals(KEY_STATUS)) {
|
|
||||||
if (sharedPreferences.getBoolean(KEY_STATUS, false)) {
|
|
||||||
startTrackingService(true, false);
|
|
||||||
} else {
|
|
||||||
stopTrackingService();
|
|
||||||
}
|
|
||||||
} else if (key.equals(KEY_DEVICE)) {
|
|
||||||
findPreference(KEY_DEVICE).setSummary(sharedPreferences.getString(KEY_DEVICE, null));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
|
|
||||||
inflater.inflate(R.menu.main, menu);
|
|
||||||
super.onCreateOptionsMenu(menu, inflater);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
if (item.getItemId() == R.id.status) {
|
|
||||||
startActivity(new Intent(getActivity(), StatusActivity.class));
|
|
||||||
return true;
|
|
||||||
} else if (item.getItemId() == R.id.about) {
|
|
||||||
startActivity(new Intent(getActivity(), AboutActivity.class));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initPreferences() {
|
|
||||||
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
|
|
||||||
|
|
||||||
if (!sharedPreferences.contains(KEY_DEVICE)) {
|
|
||||||
String id = String.valueOf(new Random().nextInt(900000) + 100000);
|
|
||||||
sharedPreferences.edit().putString(KEY_DEVICE, id).apply();
|
|
||||||
((EditTextPreference) findPreference(KEY_DEVICE)).setText(id);
|
|
||||||
}
|
|
||||||
findPreference(KEY_DEVICE).setSummary(sharedPreferences.getString(KEY_DEVICE, null));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void startTrackingService(boolean checkPermission, boolean permission) {
|
|
||||||
if (checkPermission) {
|
|
||||||
Set<String> missingPermissions = new HashSet<>();
|
|
||||||
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
|
||||||
missingPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
|
|
||||||
}
|
|
||||||
if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
|
||||||
missingPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
|
|
||||||
}
|
|
||||||
if (missingPermissions.isEmpty()) {
|
|
||||||
permission = true;
|
|
||||||
} else {
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
||||||
requestPermissions(missingPermissions.toArray(new String[missingPermissions.size()]),
|
|
||||||
PERMISSIONS_REQUEST_LOCATION);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (permission) {
|
|
||||||
setPreferencesEnabled(false);
|
|
||||||
ContextCompat.startForegroundService(getActivity(), new Intent(getActivity(), TrackingService.class));
|
|
||||||
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
|
||||||
ALARM_MANAGER_INTERVAL, ALARM_MANAGER_INTERVAL, alarmIntent);
|
|
||||||
} else {
|
|
||||||
sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply();
|
|
||||||
TwoStatePreference preference = (TwoStatePreference) findPreference(KEY_STATUS);
|
|
||||||
preference.setChecked(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void stopTrackingService() {
|
|
||||||
alarmManager.cancel(alarmIntent);
|
|
||||||
getActivity().stopService(new Intent(getActivity(), TrackingService.class));
|
|
||||||
setPreferencesEnabled(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
|
||||||
if (requestCode == PERMISSIONS_REQUEST_LOCATION) {
|
|
||||||
boolean granted = true;
|
|
||||||
for (int result : grantResults) {
|
|
||||||
if (result != PackageManager.PERMISSION_GRANTED) {
|
|
||||||
granted = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
startTrackingService(false, granted);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean validateServerURL(String userUrl) {
|
|
||||||
int port = Uri.parse(userUrl).getPort();
|
|
||||||
if (URLUtil.isValidUrl(userUrl) && (port == -1 || (port > 0 && port <= 65535))
|
|
||||||
&& (URLUtil.isHttpUrl(userUrl) || URLUtil.isHttpsUrl(userUrl))) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Toast.makeText(getActivity(), R.string.error_msg_invalid_url, Toast.LENGTH_LONG).show();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,330 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.AlarmManager
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.content.ComponentName
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.content.SharedPreferences.OnSharedPreferenceChangeListener
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.text.InputType
|
||||||
|
import android.util.Log
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuInflater
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.view.View
|
||||||
|
import android.webkit.URLUtil
|
||||||
|
import android.widget.EditText
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.appcompat.app.AlertDialog
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.preference.EditTextPreference
|
||||||
|
import androidx.preference.EditTextPreferenceDialogFragmentCompat
|
||||||
|
import androidx.preference.Preference
|
||||||
|
import androidx.preference.PreferenceFragmentCompat
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import androidx.preference.TwoStatePreference
|
||||||
|
import dev.doubledot.doki.ui.DokiActivity
|
||||||
|
import java.util.*
|
||||||
|
import kotlin.collections.HashSet
|
||||||
|
|
||||||
|
class MainFragment : PreferenceFragmentCompat(), OnSharedPreferenceChangeListener {
|
||||||
|
|
||||||
|
private lateinit var sharedPreferences: SharedPreferences
|
||||||
|
private lateinit var alarmManager: AlarmManager
|
||||||
|
private lateinit var alarmIntent: PendingIntent
|
||||||
|
private var requestingPermissions: Boolean = false
|
||||||
|
|
||||||
|
@SuppressLint("UnspecifiedImmutableFlag")
|
||||||
|
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
|
||||||
|
if (BuildConfig.HIDDEN_APP && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
|
||||||
|
removeLauncherIcon()
|
||||||
|
}
|
||||||
|
setHasOptionsMenu(true)
|
||||||
|
sharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
|
||||||
|
setPreferencesFromResource(R.xml.preferences, rootKey)
|
||||||
|
initPreferences()
|
||||||
|
|
||||||
|
findPreference<Preference>(KEY_DEVICE)?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
newValue != null && newValue != ""
|
||||||
|
}
|
||||||
|
findPreference<Preference>(KEY_URL)?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
newValue != null && validateServerURL(newValue.toString())
|
||||||
|
}
|
||||||
|
findPreference<Preference>(KEY_INTERVAL)?.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
try {
|
||||||
|
newValue != null && (newValue as String).toInt() > 0
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
Log.w(TAG, e)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val numberValidationListener = Preference.OnPreferenceChangeListener { _, newValue ->
|
||||||
|
try {
|
||||||
|
newValue != null && (newValue as String).toInt() >= 0
|
||||||
|
} catch (e: NumberFormatException) {
|
||||||
|
Log.w(TAG, e)
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
findPreference<Preference>(KEY_DISTANCE)?.onPreferenceChangeListener = numberValidationListener
|
||||||
|
findPreference<Preference>(KEY_ANGLE)?.onPreferenceChangeListener = numberValidationListener
|
||||||
|
|
||||||
|
alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
|
||||||
|
val originalIntent = Intent(activity, AutostartReceiver::class.java)
|
||||||
|
originalIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
|
||||||
|
|
||||||
|
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE
|
||||||
|
} else {
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
}
|
||||||
|
alarmIntent = PendingIntent.getBroadcast(activity, 0, originalIntent, flags)
|
||||||
|
|
||||||
|
if (sharedPreferences.getBoolean(KEY_STATUS, false)) {
|
||||||
|
startTrackingService(checkPermission = true, initialPermission = false)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NumericEditTextPreferenceDialogFragment : EditTextPreferenceDialogFragmentCompat() {
|
||||||
|
|
||||||
|
override fun onBindDialogView(view: View) {
|
||||||
|
val editText = view.findViewById<EditText>(android.R.id.edit)
|
||||||
|
editText.inputType = InputType.TYPE_CLASS_NUMBER
|
||||||
|
super.onBindDialogView(view)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun newInstance(key: String?): NumericEditTextPreferenceDialogFragment {
|
||||||
|
val fragment = NumericEditTextPreferenceDialogFragment()
|
||||||
|
val bundle = Bundle()
|
||||||
|
bundle.putString(ARG_KEY, key)
|
||||||
|
fragment.arguments = bundle
|
||||||
|
return fragment
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
override fun onDisplayPreferenceDialog(preference: Preference) {
|
||||||
|
if (listOf(KEY_INTERVAL, KEY_DISTANCE, KEY_ANGLE).contains(preference.key)) {
|
||||||
|
val f: EditTextPreferenceDialogFragmentCompat =
|
||||||
|
NumericEditTextPreferenceDialogFragment.newInstance(preference.key)
|
||||||
|
f.setTargetFragment(this, 0)
|
||||||
|
f.show(requireFragmentManager(), "androidx.preference.PreferenceFragment.DIALOG")
|
||||||
|
} else {
|
||||||
|
super.onDisplayPreferenceDialog(preference)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun removeLauncherIcon() {
|
||||||
|
val className = MainActivity::class.java.canonicalName!!.replace(".MainActivity", ".Launcher")
|
||||||
|
val componentName = ComponentName(requireActivity().packageName, className)
|
||||||
|
val packageManager = requireActivity().packageManager
|
||||||
|
if (packageManager.getComponentEnabledSetting(componentName) != PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
|
||||||
|
packageManager.setComponentEnabledSetting(
|
||||||
|
componentName,
|
||||||
|
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
|
||||||
|
PackageManager.DONT_KILL_APP
|
||||||
|
)
|
||||||
|
val builder = AlertDialog.Builder(requireActivity())
|
||||||
|
builder.setIcon(android.R.drawable.ic_dialog_alert)
|
||||||
|
builder.setMessage(getString(R.string.hidden_alert))
|
||||||
|
builder.setPositiveButton(android.R.string.ok, null)
|
||||||
|
builder.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStart() {
|
||||||
|
super.onStart()
|
||||||
|
if (requestingPermissions) {
|
||||||
|
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onResume() {
|
||||||
|
super.onResume()
|
||||||
|
sharedPreferences.registerOnSharedPreferenceChangeListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPause() {
|
||||||
|
super.onPause()
|
||||||
|
sharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setPreferencesEnabled(enabled: Boolean) {
|
||||||
|
findPreference<Preference>(KEY_DEVICE)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_URL)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_INTERVAL)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_DISTANCE)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_ANGLE)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_ACCURACY)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_BUFFER)?.isEnabled = enabled
|
||||||
|
findPreference<Preference>(KEY_WAKELOCK)?.isEnabled = enabled
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
|
||||||
|
if (key == KEY_STATUS) {
|
||||||
|
if (sharedPreferences.getBoolean(KEY_STATUS, false)) {
|
||||||
|
startTrackingService(checkPermission = true, initialPermission = false)
|
||||||
|
} else {
|
||||||
|
stopTrackingService()
|
||||||
|
}
|
||||||
|
(requireActivity().application as MainApplication).handleRatingFlow(requireActivity())
|
||||||
|
} else if (key == KEY_DEVICE) {
|
||||||
|
findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
|
||||||
|
inflater.inflate(R.menu.main, menu)
|
||||||
|
super.onCreateOptionsMenu(menu, inflater)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
if (item.itemId == R.id.status) {
|
||||||
|
startActivity(Intent(activity, StatusActivity::class.java))
|
||||||
|
return true
|
||||||
|
} else if (item.itemId == R.id.info) {
|
||||||
|
DokiActivity.start(requireContext())
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initPreferences() {
|
||||||
|
PreferenceManager.setDefaultValues(requireActivity(), R.xml.preferences, false)
|
||||||
|
if (!sharedPreferences.contains(KEY_DEVICE)) {
|
||||||
|
val id = (Random().nextInt(900000) + 100000).toString()
|
||||||
|
sharedPreferences.edit().putString(KEY_DEVICE, id).apply()
|
||||||
|
findPreference<EditTextPreference>(KEY_DEVICE)?.text = id
|
||||||
|
}
|
||||||
|
findPreference<Preference>(KEY_DEVICE)?.summary = sharedPreferences.getString(KEY_DEVICE, null)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun showBackgroundLocationDialog(context: Context, onSuccess: () -> Unit) {
|
||||||
|
val builder = AlertDialog.Builder(context)
|
||||||
|
val option = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
|
||||||
|
context.packageManager.backgroundPermissionOptionLabel
|
||||||
|
} else {
|
||||||
|
context.getString(R.string.request_background_option)
|
||||||
|
}
|
||||||
|
builder.setMessage(context.getString(R.string.request_background, option))
|
||||||
|
builder.setPositiveButton(android.R.string.ok) { _, _ -> onSuccess() }
|
||||||
|
builder.setNegativeButton(android.R.string.cancel, null)
|
||||||
|
builder.show()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun startTrackingService(checkPermission: Boolean, initialPermission: Boolean) {
|
||||||
|
var permission = initialPermission
|
||||||
|
if (checkPermission) {
|
||||||
|
val requiredPermissions: MutableSet<String> = HashSet()
|
||||||
|
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requiredPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION)
|
||||||
|
}
|
||||||
|
permission = requiredPermissions.isEmpty()
|
||||||
|
if (!permission) {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
requestPermissions(requiredPermissions.toTypedArray(), PERMISSIONS_REQUEST_LOCATION)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (permission) {
|
||||||
|
setPreferencesEnabled(false)
|
||||||
|
ContextCompat.startForegroundService(requireContext(), Intent(activity, TrackingService::class.java))
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
|
||||||
|
alarmManager.setInexactRepeating(
|
||||||
|
AlarmManager.ELAPSED_REALTIME_WAKEUP,
|
||||||
|
ALARM_MANAGER_INTERVAL.toLong(), ALARM_MANAGER_INTERVAL.toLong(), alarmIntent
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
|
||||||
|
&& ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
requestingPermissions = true
|
||||||
|
showBackgroundLocationDialog(requireContext()) {
|
||||||
|
requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSIONS_REQUEST_BACKGROUND_LOCATION)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
requestingPermissions = BatteryOptimizationHelper().requestException(requireContext())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sharedPreferences.edit().putBoolean(KEY_STATUS, false).apply()
|
||||||
|
val preference = findPreference<TwoStatePreference>(KEY_STATUS)
|
||||||
|
preference?.isChecked = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun stopTrackingService() {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
|
||||||
|
alarmManager.cancel(alarmIntent)
|
||||||
|
}
|
||||||
|
requireActivity().stopService(Intent(activity, TrackingService::class.java))
|
||||||
|
setPreferencesEnabled(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
|
||||||
|
if (requestCode == PERMISSIONS_REQUEST_LOCATION) {
|
||||||
|
var granted = true
|
||||||
|
for (result in grantResults) {
|
||||||
|
if (result != PackageManager.PERMISSION_GRANTED) {
|
||||||
|
granted = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
startTrackingService(false, granted)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun validateServerURL(userUrl: String): Boolean {
|
||||||
|
val port = Uri.parse(userUrl).port
|
||||||
|
if (
|
||||||
|
URLUtil.isValidUrl(userUrl) &&
|
||||||
|
(port == -1 || port in 1..65535) &&
|
||||||
|
(URLUtil.isHttpUrl(userUrl) || URLUtil.isHttpsUrl(userUrl))
|
||||||
|
) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
Toast.makeText(activity, R.string.error_msg_invalid_url, Toast.LENGTH_LONG).show()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = MainFragment::class.java.simpleName
|
||||||
|
private const val ALARM_MANAGER_INTERVAL = 15000
|
||||||
|
const val KEY_DEVICE = "id"
|
||||||
|
const val KEY_URL = "url"
|
||||||
|
const val KEY_INTERVAL = "interval"
|
||||||
|
const val KEY_DISTANCE = "distance"
|
||||||
|
const val KEY_ANGLE = "angle"
|
||||||
|
const val KEY_ACCURACY = "accuracy"
|
||||||
|
const val KEY_STATUS = "status"
|
||||||
|
const val KEY_BUFFER = "buffer"
|
||||||
|
const val KEY_WAKELOCK = "wakelock"
|
||||||
|
private const val PERMISSIONS_REQUEST_LOCATION = 2
|
||||||
|
private const val PERMISSIONS_REQUEST_BACKGROUND_LOCATION = 3
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.net.ConnectivityManager;
|
|
||||||
import android.net.NetworkInfo;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class NetworkManager extends BroadcastReceiver {
|
|
||||||
|
|
||||||
private static final String TAG = NetworkManager.class.getSimpleName();
|
|
||||||
|
|
||||||
private Context context;
|
|
||||||
private NetworkHandler handler;
|
|
||||||
private ConnectivityManager connectivityManager;
|
|
||||||
|
|
||||||
public NetworkManager(Context context, NetworkHandler handler) {
|
|
||||||
this.context = context;
|
|
||||||
this.handler = handler;
|
|
||||||
connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface NetworkHandler {
|
|
||||||
void onNetworkUpdate(boolean isOnline);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isOnline() {
|
|
||||||
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
|
|
||||||
return activeNetwork != null && activeNetwork.isConnectedOrConnecting();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start() {
|
|
||||||
IntentFilter filter = new IntentFilter();
|
|
||||||
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
|
|
||||||
context.registerReceiver(this, filter);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop() {
|
|
||||||
context.unregisterReceiver(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION) && handler != null) {
|
|
||||||
boolean isOnline = isOnline();
|
|
||||||
Log.i(TAG, "network " + (isOnline ? "on" : "off"));
|
|
||||||
handler.onNetworkUpdate(isOnline);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION")
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.net.ConnectivityManager
|
||||||
|
import android.util.Log
|
||||||
|
|
||||||
|
class NetworkManager(private val context: Context, private val handler: NetworkHandler?) : BroadcastReceiver() {
|
||||||
|
|
||||||
|
private val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
|
||||||
|
|
||||||
|
interface NetworkHandler {
|
||||||
|
fun onNetworkUpdate(isOnline: Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
|
val isOnline: Boolean
|
||||||
|
get() {
|
||||||
|
val activeNetwork = connectivityManager.activeNetworkInfo
|
||||||
|
return activeNetwork != null && activeNetwork.isConnectedOrConnecting
|
||||||
|
}
|
||||||
|
|
||||||
|
fun start() {
|
||||||
|
val filter = IntentFilter()
|
||||||
|
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
|
||||||
|
context.registerReceiver(this, filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop() {
|
||||||
|
context.unregisterReceiver(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onReceive(context: Context, intent: Intent) {
|
||||||
|
if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION && handler != null) {
|
||||||
|
val isOnline = isOnline
|
||||||
|
Log.i(TAG, "network " + if (isOnline) "on" else "off")
|
||||||
|
handler.onNetworkUpdate(isOnline)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = NetworkManager::class.java.simpleName
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 - 2018 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.location.Location;
|
|
||||||
import android.location.LocationManager;
|
|
||||||
import android.os.Build;
|
|
||||||
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
public class Position {
|
|
||||||
|
|
||||||
public Position() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Position(String deviceId, Location location, double battery) {
|
|
||||||
this.deviceId = deviceId;
|
|
||||||
time = new Date(location.getTime());
|
|
||||||
latitude = location.getLatitude();
|
|
||||||
longitude = location.getLongitude();
|
|
||||||
altitude = location.getAltitude();
|
|
||||||
speed = location.getSpeed() * 1.943844; // speed in knots
|
|
||||||
course = location.getBearing();
|
|
||||||
if (location.getProvider() != null && !location.getProvider().equals(LocationManager.GPS_PROVIDER)) {
|
|
||||||
accuracy = location.getAccuracy();
|
|
||||||
}
|
|
||||||
this.battery = battery;
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
|
||||||
this.mock = location.isFromMockProvider();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private long id;
|
|
||||||
|
|
||||||
public long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String deviceId;
|
|
||||||
|
|
||||||
public String getDeviceId() {
|
|
||||||
return deviceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeviceId(String deviceId) {
|
|
||||||
this.deviceId = deviceId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Date time;
|
|
||||||
|
|
||||||
public Date getTime() {
|
|
||||||
return time;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setTime(Date time) {
|
|
||||||
this.time = time;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double latitude;
|
|
||||||
|
|
||||||
public double getLatitude() {
|
|
||||||
return latitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLatitude(double latitude) {
|
|
||||||
this.latitude = latitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double longitude;
|
|
||||||
|
|
||||||
public double getLongitude() {
|
|
||||||
return longitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setLongitude(double longitude) {
|
|
||||||
this.longitude = longitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double altitude;
|
|
||||||
|
|
||||||
public double getAltitude() {
|
|
||||||
return altitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAltitude(double altitude) {
|
|
||||||
this.altitude = altitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double speed;
|
|
||||||
|
|
||||||
public double getSpeed() {
|
|
||||||
return speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSpeed(double speed) {
|
|
||||||
this.speed = speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double course;
|
|
||||||
|
|
||||||
public double getCourse() {
|
|
||||||
return course;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCourse(double course) {
|
|
||||||
this.course = course;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double accuracy;
|
|
||||||
|
|
||||||
public double getAccuracy() {
|
|
||||||
return accuracy;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAccuracy(double accuracy) {
|
|
||||||
this.accuracy = accuracy;
|
|
||||||
}
|
|
||||||
|
|
||||||
private double battery;
|
|
||||||
|
|
||||||
public double getBattery() {
|
|
||||||
return battery;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBattery(double battery) {
|
|
||||||
this.battery = battery;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean mock;
|
|
||||||
|
|
||||||
public boolean getMock() {
|
|
||||||
return mock;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMock(boolean mock) {
|
|
||||||
this.mock = mock;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.location.Location
|
||||||
|
import android.location.LocationManager
|
||||||
|
import android.os.Build
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
data class Position(
|
||||||
|
val id: Long = 0,
|
||||||
|
val deviceId: String,
|
||||||
|
val time: Date,
|
||||||
|
val latitude: Double = 0.0,
|
||||||
|
val longitude: Double = 0.0,
|
||||||
|
val altitude: Double = 0.0,
|
||||||
|
val speed: Double = 0.0,
|
||||||
|
val course: Double = 0.0,
|
||||||
|
val accuracy: Double = 0.0,
|
||||||
|
val battery: Double = 0.0,
|
||||||
|
val charging: Boolean = false,
|
||||||
|
val mock: Boolean = false,
|
||||||
|
) {
|
||||||
|
|
||||||
|
constructor(deviceId: String, location: Location, battery: BatteryStatus) : this(
|
||||||
|
deviceId = deviceId,
|
||||||
|
time = Date(location.time.correctRollover()),
|
||||||
|
latitude = location.latitude,
|
||||||
|
longitude = location.longitude,
|
||||||
|
altitude = location.altitude,
|
||||||
|
speed = location.speed * 1.943844, // speed in knots
|
||||||
|
course = location.bearing.toDouble(),
|
||||||
|
accuracy = if (location.provider != null && location.provider != LocationManager.GPS_PROVIDER) {
|
||||||
|
location.accuracy.toDouble()
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
},
|
||||||
|
battery = battery.level,
|
||||||
|
charging = battery.charging,
|
||||||
|
mock = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
location.isMock
|
||||||
|
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
location.isFromMockProvider
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private const val rolloverDate = 1554508800000L // April 6, 2019
|
||||||
|
private const val rolloverOffset = 619315200000L // 1024 weeks
|
||||||
|
|
||||||
|
private fun Long.correctRollover(): Long {
|
||||||
|
return if (this < rolloverDate) this + rolloverOffset else this
|
||||||
|
}
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2013 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.location.Criteria;
|
|
||||||
import android.location.Location;
|
|
||||||
import android.location.LocationListener;
|
|
||||||
import android.location.LocationManager;
|
|
||||||
import android.os.BatteryManager;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
public class PositionProvider implements LocationListener {
|
|
||||||
|
|
||||||
private static final String TAG = PositionProvider.class.getSimpleName();
|
|
||||||
|
|
||||||
private static final int MINIMUM_INTERVAL = 1000;
|
|
||||||
|
|
||||||
public interface PositionListener {
|
|
||||||
void onPositionUpdate(Position position);
|
|
||||||
}
|
|
||||||
|
|
||||||
private final PositionListener listener;
|
|
||||||
|
|
||||||
private final Context context;
|
|
||||||
private SharedPreferences preferences;
|
|
||||||
private LocationManager locationManager;
|
|
||||||
|
|
||||||
private String deviceId;
|
|
||||||
private long interval;
|
|
||||||
private double distance;
|
|
||||||
private double angle;
|
|
||||||
|
|
||||||
private Location lastLocation;
|
|
||||||
|
|
||||||
public PositionProvider(Context context, PositionListener listener) {
|
|
||||||
this.context = context;
|
|
||||||
this.listener = listener;
|
|
||||||
|
|
||||||
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
|
|
||||||
|
|
||||||
preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
|
|
||||||
deviceId = preferences.getString(MainFragment.KEY_DEVICE, "undefined");
|
|
||||||
interval = Long.parseLong(preferences.getString(MainFragment.KEY_INTERVAL, "600")) * 1000;
|
|
||||||
distance = Integer.parseInt(preferences.getString(MainFragment.KEY_DISTANCE, "0"));
|
|
||||||
angle = Integer.parseInt(preferences.getString(MainFragment.KEY_ANGLE, "0"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
public void startUpdates() {
|
|
||||||
try {
|
|
||||||
locationManager.requestLocationUpdates(
|
|
||||||
distance > 0 || angle > 0 ? MINIMUM_INTERVAL : interval, 0,
|
|
||||||
getCriteria(preferences.getString(MainFragment.KEY_ACCURACY, "medium")),
|
|
||||||
this, Looper.myLooper());
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Criteria getCriteria(String accuracy) {
|
|
||||||
Criteria criteria = new Criteria();
|
|
||||||
switch (accuracy) {
|
|
||||||
case "high":
|
|
||||||
criteria.setHorizontalAccuracy(Criteria.ACCURACY_HIGH);
|
|
||||||
criteria.setPowerRequirement(Criteria.POWER_HIGH);
|
|
||||||
break;
|
|
||||||
case "low":
|
|
||||||
criteria.setHorizontalAccuracy(Criteria.ACCURACY_LOW);
|
|
||||||
criteria.setPowerRequirement(Criteria.POWER_LOW);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
criteria.setHorizontalAccuracy(Criteria.ACCURACY_MEDIUM);
|
|
||||||
criteria.setPowerRequirement(Criteria.POWER_MEDIUM);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return criteria;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onLocationChanged(Location location) {
|
|
||||||
if (location != null && (lastLocation == null
|
|
||||||
|| location.getTime() - lastLocation.getTime() >= interval
|
|
||||||
|| distance > 0 && location.distanceTo(lastLocation) >= distance
|
|
||||||
|| angle > 0 && Math.abs(location.getBearing() - lastLocation.getBearing()) >= angle)) {
|
|
||||||
Log.i(TAG, "location new");
|
|
||||||
lastLocation = location;
|
|
||||||
listener.onPositionUpdate(new Position(deviceId, location, getBatteryLevel(context)));
|
|
||||||
} else {
|
|
||||||
Log.i(TAG, location != null ? "location ignored" : "location nil");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStatusChanged(String provider, int status, Bundle extras) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProviderEnabled(String provider) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProviderDisabled(String provider) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stopUpdates() {
|
|
||||||
locationManager.removeUpdates(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double getBatteryLevel(Context context) {
|
|
||||||
Intent batteryIntent = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
|
||||||
if (batteryIntent != null) {
|
|
||||||
int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
|
|
||||||
int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
|
|
||||||
return (level * 100.0) / scale;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2013 - 2022 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.IntentFilter
|
||||||
|
import android.content.SharedPreferences
|
||||||
|
import android.location.Location
|
||||||
|
import android.os.BatteryManager
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import android.util.Log
|
||||||
|
import kotlin.math.abs
|
||||||
|
|
||||||
|
abstract class PositionProvider(
|
||||||
|
protected val context: Context,
|
||||||
|
protected val listener: PositionListener,
|
||||||
|
) {
|
||||||
|
|
||||||
|
interface PositionListener {
|
||||||
|
fun onPositionUpdate(position: Position)
|
||||||
|
fun onPositionError(error: Throwable)
|
||||||
|
}
|
||||||
|
|
||||||
|
protected var preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
protected var deviceId = preferences.getString(MainFragment.KEY_DEVICE, "undefined")!!
|
||||||
|
protected var interval = preferences.getString(MainFragment.KEY_INTERVAL, "600")!!.toLong() * 1000
|
||||||
|
protected var distance: Double = preferences.getString(MainFragment.KEY_DISTANCE, "0")!!.toInt().toDouble()
|
||||||
|
protected var angle: Double = preferences.getString(MainFragment.KEY_ANGLE, "0")!!.toInt().toDouble()
|
||||||
|
private var lastLocation: Location? = null
|
||||||
|
|
||||||
|
abstract fun startUpdates()
|
||||||
|
abstract fun stopUpdates()
|
||||||
|
abstract fun requestSingleLocation()
|
||||||
|
|
||||||
|
protected fun processLocation(location: Location?) {
|
||||||
|
val lastLocation = this.lastLocation
|
||||||
|
if (location != null &&
|
||||||
|
(lastLocation == null || location.time - lastLocation!!.time >= interval || distance > 0
|
||||||
|
&& location.distanceTo(lastLocation) >= distance || angle > 0
|
||||||
|
&& abs(location.bearing - lastLocation!!.bearing) >= angle)
|
||||||
|
) {
|
||||||
|
Log.i(TAG, "location new")
|
||||||
|
this.lastLocation = location
|
||||||
|
listener.onPositionUpdate(Position(deviceId, location, getBatteryStatus(context)))
|
||||||
|
} else {
|
||||||
|
Log.i(TAG, if (location != null) "location ignored" else "location nil")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected fun getBatteryStatus(context: Context): BatteryStatus {
|
||||||
|
val batteryIntent = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
|
||||||
|
if (batteryIntent != null) {
|
||||||
|
val level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0)
|
||||||
|
val scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 1)
|
||||||
|
val status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, -1)
|
||||||
|
return BatteryStatus(
|
||||||
|
level = level * 100.0 / scale,
|
||||||
|
charging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return BatteryStatus()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = PositionProvider::class.java.simpleName
|
||||||
|
const val MINIMUM_INTERVAL: Long = 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 - 2016 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.net.Uri;
|
|
||||||
|
|
||||||
public class ProtocolFormatter {
|
|
||||||
|
|
||||||
public static String formatRequest(String url, Position position) {
|
|
||||||
return formatRequest(url, position, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String formatRequest(String url, Position position, String alarm) {
|
|
||||||
Uri serverUrl = Uri.parse(url);
|
|
||||||
Uri.Builder builder = serverUrl.buildUpon()
|
|
||||||
.appendQueryParameter("id", position.getDeviceId())
|
|
||||||
.appendQueryParameter("timestamp", String.valueOf(position.getTime().getTime() / 1000))
|
|
||||||
.appendQueryParameter("lat", String.valueOf(position.getLatitude()))
|
|
||||||
.appendQueryParameter("lon", String.valueOf(position.getLongitude()))
|
|
||||||
.appendQueryParameter("speed", String.valueOf(position.getSpeed()))
|
|
||||||
.appendQueryParameter("bearing", String.valueOf(position.getCourse()))
|
|
||||||
.appendQueryParameter("altitude", String.valueOf(position.getAltitude()))
|
|
||||||
.appendQueryParameter("accuracy", String.valueOf(position.getAccuracy()))
|
|
||||||
.appendQueryParameter("batt", String.valueOf(position.getBattery()));
|
|
||||||
|
|
||||||
if (position.getMock()) {
|
|
||||||
builder.appendQueryParameter("mock", String.valueOf(position.getMock()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (alarm != null) {
|
|
||||||
builder.appendQueryParameter("alarm", alarm);
|
|
||||||
}
|
|
||||||
|
|
||||||
return builder.build().toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.net.Uri
|
||||||
|
|
||||||
|
object ProtocolFormatter {
|
||||||
|
|
||||||
|
fun formatRequest(url: String, position: Position, alarm: String? = null): String {
|
||||||
|
val serverUrl = Uri.parse(url)
|
||||||
|
val builder = serverUrl.buildUpon()
|
||||||
|
.appendQueryParameter("id", position.deviceId)
|
||||||
|
.appendQueryParameter("timestamp", (position.time.time / 1000).toString())
|
||||||
|
.appendQueryParameter("lat", position.latitude.toString())
|
||||||
|
.appendQueryParameter("lon", position.longitude.toString())
|
||||||
|
.appendQueryParameter("speed", position.speed.toString())
|
||||||
|
.appendQueryParameter("bearing", position.course.toString())
|
||||||
|
.appendQueryParameter("altitude", position.altitude.toString())
|
||||||
|
.appendQueryParameter("accuracy", position.accuracy.toString())
|
||||||
|
.appendQueryParameter("batt", position.battery.toString())
|
||||||
|
if (position.charging) {
|
||||||
|
builder.appendQueryParameter("charge", position.charging.toString())
|
||||||
|
}
|
||||||
|
if (position.mock) {
|
||||||
|
builder.appendQueryParameter("mock", position.mock.toString())
|
||||||
|
}
|
||||||
|
if (alarm != null) {
|
||||||
|
builder.appendQueryParameter("alarm", alarm)
|
||||||
|
}
|
||||||
|
return builder.build().toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.HttpURLConnection;
|
|
||||||
import java.net.URL;
|
|
||||||
|
|
||||||
public class RequestManager {
|
|
||||||
|
|
||||||
private static final int TIMEOUT = 15 * 1000;
|
|
||||||
|
|
||||||
public interface RequestHandler {
|
|
||||||
void onComplete(boolean success);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class RequestAsyncTask extends AsyncTask<String, Void, Boolean> {
|
|
||||||
|
|
||||||
private RequestHandler handler;
|
|
||||||
|
|
||||||
public RequestAsyncTask(RequestHandler handler) {
|
|
||||||
this.handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Boolean doInBackground(String... request) {
|
|
||||||
return sendRequest(request[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onPostExecute(Boolean result) {
|
|
||||||
handler.onComplete(result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean sendRequest(String request) {
|
|
||||||
InputStream inputStream = null;
|
|
||||||
try {
|
|
||||||
URL url = new URL(request);
|
|
||||||
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
|
|
||||||
connection.setReadTimeout(TIMEOUT);
|
|
||||||
connection.setConnectTimeout(TIMEOUT);
|
|
||||||
connection.setRequestMethod("POST");
|
|
||||||
connection.connect();
|
|
||||||
inputStream = connection.getInputStream();
|
|
||||||
while (inputStream.read() != -1);
|
|
||||||
return true;
|
|
||||||
} catch (IOException error) {
|
|
||||||
return false;
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (inputStream != null) {
|
|
||||||
inputStream.close();
|
|
||||||
}
|
|
||||||
} catch (IOException secondError) {
|
|
||||||
Log.w(RequestManager.class.getSimpleName(), secondError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void sendRequestAsync(String request, RequestHandler handler) {
|
|
||||||
RequestAsyncTask task = new RequestAsyncTask(handler);
|
|
||||||
task.execute(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
@file:Suppress("DEPRECATION")
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.os.AsyncTask
|
||||||
|
import android.util.Log
|
||||||
|
import java.io.IOException
|
||||||
|
import java.io.InputStream
|
||||||
|
import java.net.HttpURLConnection
|
||||||
|
import java.net.URL
|
||||||
|
|
||||||
|
object RequestManager {
|
||||||
|
|
||||||
|
private const val TIMEOUT = 15 * 1000
|
||||||
|
|
||||||
|
fun sendRequest(request: String?): Boolean {
|
||||||
|
var inputStream: InputStream? = null
|
||||||
|
return try {
|
||||||
|
val url = URL(request)
|
||||||
|
val connection = url.openConnection() as HttpURLConnection
|
||||||
|
connection.readTimeout = TIMEOUT
|
||||||
|
connection.connectTimeout = TIMEOUT
|
||||||
|
connection.requestMethod = "POST"
|
||||||
|
connection.connect()
|
||||||
|
inputStream = connection.inputStream
|
||||||
|
while (inputStream.read() != -1) {}
|
||||||
|
true
|
||||||
|
} catch (error: IOException) {
|
||||||
|
false
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
inputStream?.close()
|
||||||
|
} catch (secondError: IOException) {
|
||||||
|
Log.w(RequestManager::class.java.simpleName, secondError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun sendRequestAsync(request: String, handler: RequestHandler) {
|
||||||
|
RequestAsyncTask(handler).execute(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface RequestHandler {
|
||||||
|
fun onComplete(success: Boolean)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class RequestAsyncTask(private val handler: RequestHandler) : AsyncTask<String, Unit, Boolean>() {
|
||||||
|
|
||||||
|
override fun doInBackground(vararg request: String): Boolean {
|
||||||
|
return sendRequest(request[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPostExecute(result: Boolean) {
|
||||||
|
handler.onComplete(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,201 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2016 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.location.Criteria;
|
|
||||||
import android.location.Location;
|
|
||||||
import android.location.LocationListener;
|
|
||||||
import android.location.LocationManager;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.support.annotation.DrawableRes;
|
|
||||||
import android.support.v4.content.ContextCompat;
|
|
||||||
import android.support.v4.content.pm.ShortcutInfoCompat;
|
|
||||||
import android.support.v4.content.pm.ShortcutManagerCompat;
|
|
||||||
import android.support.v4.graphics.drawable.IconCompat;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.widget.AdapterView;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.ListView;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
public class ShortcutActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
public static final String EXTRA_ACTION = "action";
|
|
||||||
public static final String ACTION_START = "start";
|
|
||||||
public static final String ACTION_STOP = "stop";
|
|
||||||
public static final String ACTION_SOS = "sos";
|
|
||||||
|
|
||||||
private static final String ALARM_SOS = "sos";
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
if (!executeAction(getIntent())) {
|
|
||||||
setContentView(R.layout.list);
|
|
||||||
|
|
||||||
final String[] items = new String[] {
|
|
||||||
getString(R.string.shortcut_start),
|
|
||||||
getString(R.string.shortcut_stop),
|
|
||||||
getString(R.string.shortcut_sos)
|
|
||||||
};
|
|
||||||
|
|
||||||
ListView listView = findViewById(android.R.id.list);
|
|
||||||
|
|
||||||
listView.setAdapter(new ArrayAdapter<>(
|
|
||||||
this, android.R.layout.simple_list_item_1, items));
|
|
||||||
|
|
||||||
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
|
||||||
switch (position) {
|
|
||||||
case 0:
|
|
||||||
setShortcutResult(items[position], R.mipmap.ic_start, ACTION_START);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
setShortcutResult(items[position], R.mipmap.ic_stop, ACTION_STOP);
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
setShortcutResult(items[position], R.mipmap.ic_sos, ACTION_SOS);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onNewIntent(Intent intent) {
|
|
||||||
super.onNewIntent(intent);
|
|
||||||
executeAction(intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setShortcutResult(String label, @DrawableRes int iconResId, String action) {
|
|
||||||
Intent intent = new Intent(Intent.ACTION_DEFAULT, null, this, ShortcutActivity.class);
|
|
||||||
intent.putExtra(EXTRA_ACTION, action);
|
|
||||||
|
|
||||||
ShortcutInfoCompat shortcut = new ShortcutInfoCompat.Builder(this, action)
|
|
||||||
.setShortLabel(label)
|
|
||||||
.setIcon(IconCompat.createWithResource(this, iconResId))
|
|
||||||
.setIntent(intent)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(this, shortcut));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("MissingPermission")
|
|
||||||
private void sendAlarm() {
|
|
||||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
|
|
||||||
|
|
||||||
Criteria criteria = PositionProvider.getCriteria(
|
|
||||||
preferences.getString(MainFragment.KEY_ACCURACY, "medium"));
|
|
||||||
|
|
||||||
try {
|
|
||||||
Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, true));
|
|
||||||
if (location != null) {
|
|
||||||
sendAlarmLocation(location);
|
|
||||||
} else {
|
|
||||||
locationManager.requestSingleUpdate(criteria, new LocationListener() {
|
|
||||||
@Override
|
|
||||||
public void onLocationChanged(Location location) {
|
|
||||||
sendAlarmLocation(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStatusChanged(String provider, int status, Bundle extras) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProviderEnabled(String provider) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProviderDisabled(String provider) {
|
|
||||||
}
|
|
||||||
}, Looper.myLooper());
|
|
||||||
}
|
|
||||||
} catch (RuntimeException e) {
|
|
||||||
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void sendAlarmLocation(Location location) {
|
|
||||||
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
|
|
||||||
|
|
||||||
Position position = new Position(
|
|
||||||
preferences.getString(MainFragment.KEY_DEVICE, null),
|
|
||||||
location, PositionProvider.getBatteryLevel(this));
|
|
||||||
|
|
||||||
String request = ProtocolFormatter.formatRequest(
|
|
||||||
preferences.getString(MainFragment.KEY_URL, null), position, ALARM_SOS);
|
|
||||||
|
|
||||||
RequestManager.sendRequestAsync(request, new RequestManager.RequestHandler() {
|
|
||||||
@Override
|
|
||||||
public void onComplete(boolean success) {
|
|
||||||
if (success) {
|
|
||||||
Toast.makeText(ShortcutActivity.this, R.string.status_send_success, Toast.LENGTH_SHORT).show();
|
|
||||||
} else {
|
|
||||||
Toast.makeText(ShortcutActivity.this, R.string.status_send_fail, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean executeAction(Intent intent) {
|
|
||||||
String action;
|
|
||||||
if (intent.hasExtra("shortcutAction")) {
|
|
||||||
action = intent.getBooleanExtra("shortcutAction", false)
|
|
||||||
? ACTION_START : ACTION_STOP;
|
|
||||||
} else {
|
|
||||||
action = intent.getStringExtra(EXTRA_ACTION);
|
|
||||||
}
|
|
||||||
if (action != null) {
|
|
||||||
switch (action) {
|
|
||||||
case ACTION_START:
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.edit().putBoolean(MainFragment.KEY_STATUS, true).apply();
|
|
||||||
ContextCompat.startForegroundService(this, new Intent(this, TrackingService.class));
|
|
||||||
Toast.makeText(this, R.string.status_service_create, Toast.LENGTH_SHORT).show();
|
|
||||||
break;
|
|
||||||
case ACTION_STOP:
|
|
||||||
PreferenceManager.getDefaultSharedPreferences(this)
|
|
||||||
.edit().putBoolean(MainFragment.KEY_STATUS, false).apply();
|
|
||||||
stopService(new Intent(this, TrackingService.class));
|
|
||||||
Toast.makeText(this, R.string.status_service_destroy, Toast.LENGTH_SHORT).show();
|
|
||||||
break;
|
|
||||||
case ACTION_SOS:
|
|
||||||
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|
|
||||||
&& ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
|
||||||
sendAlarm();
|
|
||||||
} else {
|
|
||||||
Toast.makeText(this, R.string.status_send_fail, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
return action != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,138 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.widget.AdapterView.OnItemClickListener
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
|
import android.widget.ListView
|
||||||
|
import android.widget.Toast
|
||||||
|
import androidx.annotation.DrawableRes
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.core.content.pm.ShortcutInfoCompat
|
||||||
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
|
import androidx.core.graphics.drawable.IconCompat
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import org.traccar.client.PositionProvider.PositionListener
|
||||||
|
import org.traccar.client.ProtocolFormatter.formatRequest
|
||||||
|
import org.traccar.client.RequestManager.RequestHandler
|
||||||
|
import org.traccar.client.RequestManager.sendRequestAsync
|
||||||
|
|
||||||
|
class ShortcutActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
if (!executeAction(intent)) {
|
||||||
|
setContentView(R.layout.list)
|
||||||
|
val items = arrayOf(
|
||||||
|
getString(R.string.shortcut_start),
|
||||||
|
getString(R.string.shortcut_stop),
|
||||||
|
getString(R.string.shortcut_sos)
|
||||||
|
)
|
||||||
|
val listView = findViewById<ListView>(android.R.id.list)
|
||||||
|
listView.adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
|
||||||
|
listView.onItemClickListener = OnItemClickListener { _, _, position, _ ->
|
||||||
|
when (position) {
|
||||||
|
0 -> setShortcutResult(items[position], R.mipmap.ic_start, ACTION_START)
|
||||||
|
1 -> setShortcutResult(items[position], R.mipmap.ic_stop, ACTION_STOP)
|
||||||
|
2 -> setShortcutResult(items[position], R.mipmap.ic_sos, ACTION_SOS)
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onNewIntent(intent: Intent) {
|
||||||
|
super.onNewIntent(intent)
|
||||||
|
executeAction(intent)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun setShortcutResult(label: String, @DrawableRes iconResId: Int, action: String) {
|
||||||
|
val intent = Intent(Intent.ACTION_DEFAULT, null, this, ShortcutActivity::class.java)
|
||||||
|
intent.putExtra(EXTRA_ACTION, action)
|
||||||
|
val shortcut = ShortcutInfoCompat.Builder(this, action)
|
||||||
|
.setShortLabel(label)
|
||||||
|
.setIcon(IconCompat.createWithResource(this, iconResId))
|
||||||
|
.setIntent(intent)
|
||||||
|
.build()
|
||||||
|
setResult(RESULT_OK, ShortcutManagerCompat.createShortcutResultIntent(this, shortcut))
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun sendAlarm() {
|
||||||
|
PositionProviderFactory.create(this, object : PositionListener {
|
||||||
|
override fun onPositionUpdate(position: Position) {
|
||||||
|
val preferences = PreferenceManager.getDefaultSharedPreferences(this@ShortcutActivity)
|
||||||
|
val request = formatRequest(preferences.getString(MainFragment.KEY_URL, null)!!, position, ALARM_SOS)
|
||||||
|
sendRequestAsync(request, object : RequestHandler {
|
||||||
|
override fun onComplete(success: Boolean) {
|
||||||
|
if (success) {
|
||||||
|
Toast.makeText(this@ShortcutActivity, R.string.status_send_success, Toast.LENGTH_SHORT).show()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this@ShortcutActivity, R.string.status_send_fail, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPositionError(error: Throwable) {
|
||||||
|
Toast.makeText(this@ShortcutActivity, error.message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
|
}).requestSingleLocation()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun executeAction(intent: Intent): Boolean {
|
||||||
|
val action: String? = if (intent.hasExtra("shortcutAction")) {
|
||||||
|
if (intent.getBooleanExtra("shortcutAction", false)) ACTION_START else ACTION_STOP
|
||||||
|
} else {
|
||||||
|
intent.getStringExtra(EXTRA_ACTION)
|
||||||
|
}
|
||||||
|
if (action != null) {
|
||||||
|
when (action) {
|
||||||
|
ACTION_START -> {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(MainFragment.KEY_STATUS, true).apply()
|
||||||
|
ContextCompat.startForegroundService(this, Intent(this, TrackingService::class.java))
|
||||||
|
Toast.makeText(this, R.string.status_service_create, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
ACTION_STOP -> {
|
||||||
|
PreferenceManager.getDefaultSharedPreferences(this).edit().putBoolean(MainFragment.KEY_STATUS, false).apply()
|
||||||
|
stopService(Intent(this, TrackingService::class.java))
|
||||||
|
Toast.makeText(this, R.string.status_service_destroy, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
ACTION_SOS -> {
|
||||||
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
sendAlarm()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(this, R.string.status_send_fail, Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
return action != null
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val EXTRA_ACTION = "action"
|
||||||
|
const val ACTION_START = "start"
|
||||||
|
const val ACTION_STOP = "stop"
|
||||||
|
const val ACTION_SOS = "sos"
|
||||||
|
private const val ALARM_SOS = "sos"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import java.text.DateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.support.v7.app.AppCompatActivity;
|
|
||||||
import android.view.Menu;
|
|
||||||
import android.view.MenuInflater;
|
|
||||||
import android.view.MenuItem;
|
|
||||||
import android.widget.ArrayAdapter;
|
|
||||||
import android.widget.ListView;
|
|
||||||
|
|
||||||
public class StatusActivity extends AppCompatActivity {
|
|
||||||
|
|
||||||
private static final int LIMIT = 20;
|
|
||||||
|
|
||||||
private static final LinkedList<String> messages = new LinkedList<>();
|
|
||||||
private static final Set<ArrayAdapter<String>> adapters = new HashSet<>();
|
|
||||||
|
|
||||||
private static void notifyAdapters() {
|
|
||||||
for (ArrayAdapter<String> adapter : adapters) {
|
|
||||||
adapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void addMessage(String message) {
|
|
||||||
DateFormat format = DateFormat.getTimeInstance(DateFormat.MEDIUM);
|
|
||||||
message = format.format(new Date()) + " - " + message;
|
|
||||||
messages.add(message);
|
|
||||||
while (messages.size() > LIMIT) {
|
|
||||||
messages.removeFirst();
|
|
||||||
}
|
|
||||||
notifyAdapters();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearMessages() {
|
|
||||||
messages.clear();
|
|
||||||
notifyAdapters();
|
|
||||||
}
|
|
||||||
|
|
||||||
private ArrayAdapter<String> adapter;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
setContentView(R.layout.list);
|
|
||||||
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, android.R.id.text1, messages);
|
|
||||||
ListView listView = findViewById(android.R.id.list);
|
|
||||||
listView.setAdapter(adapter);
|
|
||||||
adapters.add(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
adapters.remove(adapter);
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
|
||||||
MenuInflater inflater = getMenuInflater();
|
|
||||||
inflater.inflate(R.menu.status, menu);
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
|
||||||
if (item.getItemId() == R.id.clear) {
|
|
||||||
clearMessages();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return super.onOptionsItemSelected(item);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
|
import android.widget.ArrayAdapter
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.Menu
|
||||||
|
import android.view.MenuItem
|
||||||
|
import android.widget.ListView
|
||||||
|
import java.text.DateFormat
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class StatusActivity : AppCompatActivity() {
|
||||||
|
|
||||||
|
private var adapter: ArrayAdapter<String>? = null
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
setContentView(R.layout.list)
|
||||||
|
adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, messages)
|
||||||
|
val listView = findViewById<ListView>(android.R.id.list)
|
||||||
|
listView.adapter = adapter
|
||||||
|
adapter?.let { adapters.add(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
adapters.remove(adapter)
|
||||||
|
super.onDestroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
|
val inflater = menuInflater
|
||||||
|
inflater.inflate(R.menu.status, menu)
|
||||||
|
return super.onCreateOptionsMenu(menu)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
||||||
|
if (item.itemId == R.id.clear) {
|
||||||
|
clearMessages()
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private const val LIMIT = 20
|
||||||
|
private val messages = LinkedList<String>()
|
||||||
|
private val adapters: MutableSet<ArrayAdapter<String>> = HashSet()
|
||||||
|
|
||||||
|
private fun notifyAdapters() {
|
||||||
|
for (adapter in adapters) {
|
||||||
|
adapter.notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addMessage(originalMessage: String) {
|
||||||
|
var message = originalMessage
|
||||||
|
val format = DateFormat.getTimeInstance(DateFormat.MEDIUM)
|
||||||
|
message = format.format(Date()) + " - " + message
|
||||||
|
messages.add(message)
|
||||||
|
while (messages.size > LIMIT) {
|
||||||
|
messages.removeFirst()
|
||||||
|
}
|
||||||
|
notifyAdapters()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clearMessages() {
|
||||||
|
messages.clear()
|
||||||
|
notifyAdapters()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,217 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2015 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.preference.PreferenceManager;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class TrackingController implements PositionProvider.PositionListener, NetworkManager.NetworkHandler {
|
|
||||||
|
|
||||||
private static final String TAG = TrackingController.class.getSimpleName();
|
|
||||||
private static final int RETRY_DELAY = 30 * 1000;
|
|
||||||
private static final int WAKE_LOCK_TIMEOUT = 120 * 1000;
|
|
||||||
|
|
||||||
private boolean isOnline;
|
|
||||||
private boolean isWaiting;
|
|
||||||
|
|
||||||
private Context context;
|
|
||||||
private Handler handler;
|
|
||||||
private SharedPreferences preferences;
|
|
||||||
|
|
||||||
private String url;
|
|
||||||
|
|
||||||
private PositionProvider positionProvider;
|
|
||||||
private DatabaseHelper databaseHelper;
|
|
||||||
private NetworkManager networkManager;
|
|
||||||
|
|
||||||
private PowerManager.WakeLock wakeLock;
|
|
||||||
|
|
||||||
private void lock() {
|
|
||||||
wakeLock.acquire(WAKE_LOCK_TIMEOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void unlock() {
|
|
||||||
if (wakeLock.isHeld()) {
|
|
||||||
wakeLock.release();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public TrackingController(Context context) {
|
|
||||||
this.context = context;
|
|
||||||
handler = new Handler();
|
|
||||||
preferences = PreferenceManager.getDefaultSharedPreferences(context);
|
|
||||||
positionProvider = new PositionProvider(context, this);
|
|
||||||
databaseHelper = new DatabaseHelper(context);
|
|
||||||
networkManager = new NetworkManager(context, this);
|
|
||||||
isOnline = networkManager.isOnline();
|
|
||||||
|
|
||||||
url = preferences.getString(MainFragment.KEY_URL, context.getString(R.string.settings_url_default_value));
|
|
||||||
|
|
||||||
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
|
|
||||||
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void start() {
|
|
||||||
if (isOnline) {
|
|
||||||
read();
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
positionProvider.startUpdates();
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
Log.w(TAG, e);
|
|
||||||
}
|
|
||||||
networkManager.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stop() {
|
|
||||||
networkManager.stop();
|
|
||||||
try {
|
|
||||||
positionProvider.stopUpdates();
|
|
||||||
} catch (SecurityException e) {
|
|
||||||
Log.w(TAG, e);
|
|
||||||
}
|
|
||||||
handler.removeCallbacksAndMessages(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onPositionUpdate(Position position) {
|
|
||||||
StatusActivity.addMessage(context.getString(R.string.status_location_update));
|
|
||||||
if (position != null) {
|
|
||||||
write(position);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onNetworkUpdate(boolean isOnline) {
|
|
||||||
int message = isOnline ? R.string.status_network_online : R.string.status_network_offline;
|
|
||||||
StatusActivity.addMessage(context.getString(message));
|
|
||||||
if (!this.isOnline && isOnline) {
|
|
||||||
read();
|
|
||||||
}
|
|
||||||
this.isOnline = isOnline;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// State transition examples:
|
|
||||||
//
|
|
||||||
// write -> read -> send -> delete -> read
|
|
||||||
//
|
|
||||||
// read -> send -> retry -> read -> send
|
|
||||||
//
|
|
||||||
|
|
||||||
private void log(String action, Position position) {
|
|
||||||
if (position != null) {
|
|
||||||
action += " (" +
|
|
||||||
"id:" + position.getId() +
|
|
||||||
" time:" + position.getTime().getTime() / 1000 +
|
|
||||||
" lat:" + position.getLatitude() +
|
|
||||||
" lon:" + position.getLongitude() + ")";
|
|
||||||
}
|
|
||||||
Log.d(TAG, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void write(Position position) {
|
|
||||||
log("write", position);
|
|
||||||
lock();
|
|
||||||
databaseHelper.insertPositionAsync(position, new DatabaseHelper.DatabaseHandler<Void>() {
|
|
||||||
@Override
|
|
||||||
public void onComplete(boolean success, Void result) {
|
|
||||||
if (success) {
|
|
||||||
if (isOnline && isWaiting) {
|
|
||||||
read();
|
|
||||||
isWaiting = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void read() {
|
|
||||||
log("read", null);
|
|
||||||
lock();
|
|
||||||
databaseHelper.selectPositionAsync(new DatabaseHelper.DatabaseHandler<Position>() {
|
|
||||||
@Override
|
|
||||||
public void onComplete(boolean success, Position result) {
|
|
||||||
if (success) {
|
|
||||||
if (result != null) {
|
|
||||||
if (result.getDeviceId().equals(preferences.getString(MainFragment.KEY_DEVICE, null))) {
|
|
||||||
send(result);
|
|
||||||
} else {
|
|
||||||
delete(result);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
isWaiting = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
retry();
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void delete(Position position) {
|
|
||||||
log("delete", position);
|
|
||||||
lock();
|
|
||||||
databaseHelper.deletePositionAsync(position.getId(), new DatabaseHelper.DatabaseHandler<Void>() {
|
|
||||||
@Override
|
|
||||||
public void onComplete(boolean success, Void result) {
|
|
||||||
if (success) {
|
|
||||||
read();
|
|
||||||
} else {
|
|
||||||
retry();
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void send(final Position position) {
|
|
||||||
log("send", position);
|
|
||||||
lock();
|
|
||||||
String request = ProtocolFormatter.formatRequest(url, position);
|
|
||||||
RequestManager.sendRequestAsync(request, new RequestManager.RequestHandler() {
|
|
||||||
@Override
|
|
||||||
public void onComplete(boolean success) {
|
|
||||||
if (success) {
|
|
||||||
delete(position);
|
|
||||||
} else {
|
|
||||||
StatusActivity.addMessage(context.getString(R.string.status_send_fail));
|
|
||||||
retry();
|
|
||||||
}
|
|
||||||
unlock();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void retry() {
|
|
||||||
log("retry", null);
|
|
||||||
handler.postDelayed(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
if (isOnline) {
|
|
||||||
read();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, RETRY_DELAY);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import org.traccar.client.ProtocolFormatter.formatRequest
|
||||||
|
import org.traccar.client.RequestManager.sendRequestAsync
|
||||||
|
import org.traccar.client.PositionProvider.PositionListener
|
||||||
|
import org.traccar.client.NetworkManager.NetworkHandler
|
||||||
|
import android.os.Handler
|
||||||
|
import android.os.Looper
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
import android.util.Log
|
||||||
|
import org.traccar.client.DatabaseHelper.DatabaseHandler
|
||||||
|
import org.traccar.client.RequestManager.RequestHandler
|
||||||
|
|
||||||
|
class TrackingController(private val context: Context) : PositionListener, NetworkHandler {
|
||||||
|
|
||||||
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
|
private val preferences = PreferenceManager.getDefaultSharedPreferences(context)
|
||||||
|
private val positionProvider = PositionProviderFactory.create(context, this)
|
||||||
|
private val databaseHelper = DatabaseHelper(context)
|
||||||
|
private val networkManager = NetworkManager(context, this)
|
||||||
|
|
||||||
|
private val url: String = preferences.getString(MainFragment.KEY_URL, context.getString(R.string.settings_url_default_value))!!
|
||||||
|
private val buffer: Boolean = preferences.getBoolean(MainFragment.KEY_BUFFER, true)
|
||||||
|
|
||||||
|
private var isOnline = networkManager.isOnline
|
||||||
|
private var isWaiting = false
|
||||||
|
|
||||||
|
fun start() {
|
||||||
|
if (isOnline) {
|
||||||
|
read()
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
positionProvider.startUpdates()
|
||||||
|
} catch (e: SecurityException) {
|
||||||
|
Log.w(TAG, e)
|
||||||
|
}
|
||||||
|
networkManager.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun stop() {
|
||||||
|
networkManager.stop()
|
||||||
|
try {
|
||||||
|
positionProvider.stopUpdates()
|
||||||
|
} catch (e: SecurityException) {
|
||||||
|
Log.w(TAG, e)
|
||||||
|
}
|
||||||
|
handler.removeCallbacksAndMessages(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPositionUpdate(position: Position) {
|
||||||
|
StatusActivity.addMessage(context.getString(R.string.status_location_update))
|
||||||
|
if (buffer) {
|
||||||
|
write(position)
|
||||||
|
} else {
|
||||||
|
send(position)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onPositionError(error: Throwable) {}
|
||||||
|
override fun onNetworkUpdate(isOnline: Boolean) {
|
||||||
|
val message = if (isOnline) R.string.status_network_online else R.string.status_network_offline
|
||||||
|
StatusActivity.addMessage(context.getString(message))
|
||||||
|
if (!this.isOnline && isOnline) {
|
||||||
|
read()
|
||||||
|
}
|
||||||
|
this.isOnline = isOnline
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// State transition examples:
|
||||||
|
//
|
||||||
|
// write -> read -> send -> delete -> read
|
||||||
|
//
|
||||||
|
// read -> send -> retry -> read -> send
|
||||||
|
//
|
||||||
|
|
||||||
|
private fun log(action: String, position: Position?) {
|
||||||
|
var formattedAction: String = action
|
||||||
|
if (position != null) {
|
||||||
|
formattedAction +=
|
||||||
|
" (id:" + position.id +
|
||||||
|
" time:" + position.time.time / 1000 +
|
||||||
|
" lat:" + position.latitude +
|
||||||
|
" lon:" + position.longitude + ")"
|
||||||
|
}
|
||||||
|
Log.d(TAG, formattedAction)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun write(position: Position) {
|
||||||
|
log("write", position)
|
||||||
|
databaseHelper.insertPositionAsync(position, object : DatabaseHandler<Unit?> {
|
||||||
|
override fun onComplete(success: Boolean, result: Unit?) {
|
||||||
|
if (success) {
|
||||||
|
if (isOnline && isWaiting) {
|
||||||
|
read()
|
||||||
|
isWaiting = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun read() {
|
||||||
|
log("read", null)
|
||||||
|
databaseHelper.selectPositionAsync(object : DatabaseHandler<Position?> {
|
||||||
|
override fun onComplete(success: Boolean, result: Position?) {
|
||||||
|
if (success) {
|
||||||
|
if (result != null) {
|
||||||
|
if (result.deviceId == preferences.getString(MainFragment.KEY_DEVICE, null)) {
|
||||||
|
send(result)
|
||||||
|
} else {
|
||||||
|
delete(result)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
isWaiting = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun delete(position: Position) {
|
||||||
|
log("delete", position)
|
||||||
|
databaseHelper.deletePositionAsync(position.id, object : DatabaseHandler<Unit?> {
|
||||||
|
override fun onComplete(success: Boolean, result: Unit?) {
|
||||||
|
if (success) {
|
||||||
|
read()
|
||||||
|
} else {
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun send(position: Position) {
|
||||||
|
log("send", position)
|
||||||
|
val request = formatRequest(url, position)
|
||||||
|
sendRequestAsync(request, object : RequestHandler {
|
||||||
|
override fun onComplete(success: Boolean) {
|
||||||
|
if (success) {
|
||||||
|
if (buffer) {
|
||||||
|
delete(position)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
StatusActivity.addMessage(context.getString(R.string.status_send_fail))
|
||||||
|
if (buffer) {
|
||||||
|
retry()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun retry() {
|
||||||
|
log("retry", null)
|
||||||
|
handler.postDelayed({
|
||||||
|
if (isOnline) {
|
||||||
|
read()
|
||||||
|
}
|
||||||
|
}, RETRY_DELAY.toLong())
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
private val TAG = TrackingController::class.java.simpleName
|
||||||
|
private const val RETRY_DELAY = 30 * 1000
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2012 - 2017 Anton Tananaev (anton.tananaev@gmail.com)
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
|
|
||||||
import android.annotation.TargetApi;
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.app.Service;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.IBinder;
|
|
||||||
import android.support.v4.app.NotificationCompat;
|
|
||||||
import android.support.v4.content.ContextCompat;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
public class TrackingService extends Service {
|
|
||||||
|
|
||||||
private static final String TAG = TrackingService.class.getSimpleName();
|
|
||||||
private static final int NOTIFICATION_ID = 1;
|
|
||||||
|
|
||||||
private TrackingController trackingController;
|
|
||||||
|
|
||||||
private static Notification createNotification(Context context) {
|
|
||||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, MainApplication.PRIMARY_CHANNEL)
|
|
||||||
.setSmallIcon(R.drawable.ic_stat_notify)
|
|
||||||
.setPriority(NotificationCompat.PRIORITY_LOW)
|
|
||||||
.setCategory(Notification.CATEGORY_SERVICE);
|
|
||||||
Intent intent;
|
|
||||||
if (!BuildConfig.HIDDEN_APP) {
|
|
||||||
intent = new Intent(context, MainActivity.class);
|
|
||||||
builder
|
|
||||||
.setContentTitle(context.getString(R.string.settings_status_on_summary))
|
|
||||||
.setTicker(context.getString(R.string.settings_status_on_summary))
|
|
||||||
.setColor(ContextCompat.getColor(context, R.color.primary_dark));
|
|
||||||
} else {
|
|
||||||
intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
|
|
||||||
}
|
|
||||||
builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
|
|
||||||
return builder.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class HideNotificationService extends Service {
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
startForeground(NOTIFICATION_ID, createNotification(this));
|
|
||||||
stopForeground(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
||||||
stopSelfResult(startId);
|
|
||||||
return START_NOT_STICKY;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate() {
|
|
||||||
Log.i(TAG, "service create");
|
|
||||||
StatusActivity.addMessage(getString(R.string.status_service_create));
|
|
||||||
|
|
||||||
startForeground(NOTIFICATION_ID, createNotification(this));
|
|
||||||
|
|
||||||
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
|
|
||||||
&& ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
|
||||||
trackingController = new TrackingController(this);
|
|
||||||
trackingController.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
|
||||||
ContextCompat.startForegroundService(this, new Intent(this, HideNotificationService.class));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@TargetApi(Build.VERSION_CODES.ECLAIR)
|
|
||||||
@Override
|
|
||||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
|
||||||
if (intent != null) {
|
|
||||||
AutostartReceiver.completeWakefulIntent(intent);
|
|
||||||
}
|
|
||||||
return START_STICKY;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDestroy() {
|
|
||||||
Log.i(TAG, "service destroy");
|
|
||||||
StatusActivity.addMessage(getString(R.string.status_service_destroy));
|
|
||||||
|
|
||||||
stopForeground(true);
|
|
||||||
|
|
||||||
if (trackingController != null) {
|
|
||||||
trackingController.stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2012 - 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.Manifest
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.annotation.TargetApi
|
||||||
|
import android.app.Notification
|
||||||
|
import android.app.PendingIntent
|
||||||
|
import android.app.Service
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.IBinder
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.os.PowerManager.WakeLock
|
||||||
|
import android.provider.Settings
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import androidx.preference.PreferenceManager
|
||||||
|
|
||||||
|
class TrackingService : Service() {
|
||||||
|
|
||||||
|
private var wakeLock: WakeLock? = null
|
||||||
|
private var trackingController: TrackingController? = null
|
||||||
|
|
||||||
|
class HideNotificationService : Service() {
|
||||||
|
override fun onBind(intent: Intent): IBinder? {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
startForeground(NOTIFICATION_ID, createNotification(this))
|
||||||
|
stopForeground(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
|
stopSelfResult(startId)
|
||||||
|
return START_NOT_STICKY
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressLint("WakelockTimeout")
|
||||||
|
override fun onCreate() {
|
||||||
|
startForeground(NOTIFICATION_ID, createNotification(this))
|
||||||
|
Log.i(TAG, "service create")
|
||||||
|
sendBroadcast(Intent(ACTION_STARTED))
|
||||||
|
StatusActivity.addMessage(getString(R.string.status_service_create))
|
||||||
|
|
||||||
|
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
if (PreferenceManager.getDefaultSharedPreferences(this).getBoolean(MainFragment.KEY_WAKELOCK, true)) {
|
||||||
|
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
|
||||||
|
wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, javaClass.name)
|
||||||
|
wakeLock?.acquire()
|
||||||
|
}
|
||||||
|
trackingController = TrackingController(this)
|
||||||
|
trackingController?.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||||
|
ContextCompat.startForegroundService(this, Intent(this, HideNotificationService::class.java))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBind(intent: Intent): IBinder? {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.ECLAIR)
|
||||||
|
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
|
||||||
|
WakefulBroadcastReceiver.completeWakefulIntent(intent)
|
||||||
|
return START_STICKY
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
stopForeground(true)
|
||||||
|
Log.i(TAG, "service destroy")
|
||||||
|
sendBroadcast(Intent(ACTION_STOPPED))
|
||||||
|
StatusActivity.addMessage(getString(R.string.status_service_destroy))
|
||||||
|
if (wakeLock?.isHeld == true) {
|
||||||
|
wakeLock?.release()
|
||||||
|
}
|
||||||
|
trackingController?.stop()
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
const val ACTION_STARTED = "org.traccar.action.SERVICE_STARTED"
|
||||||
|
const val ACTION_STOPPED = "org.traccar.action.SERVICE_STOPPED"
|
||||||
|
private val TAG = TrackingService::class.java.simpleName
|
||||||
|
private const val NOTIFICATION_ID = 1
|
||||||
|
|
||||||
|
@SuppressLint("UnspecifiedImmutableFlag")
|
||||||
|
private fun createNotification(context: Context): Notification {
|
||||||
|
val builder = NotificationCompat.Builder(context, MainApplication.PRIMARY_CHANNEL)
|
||||||
|
.setSmallIcon(R.drawable.ic_stat_notify)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_LOW)
|
||||||
|
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||||
|
val intent: Intent
|
||||||
|
if (!BuildConfig.HIDDEN_APP) {
|
||||||
|
intent = Intent(context, MainActivity::class.java)
|
||||||
|
builder
|
||||||
|
.setContentTitle(context.getString(R.string.settings_status_on_summary))
|
||||||
|
.setTicker(context.getString(R.string.settings_status_on_summary))
|
||||||
|
.color = ContextCompat.getColor(context, R.color.primary_dark)
|
||||||
|
} else {
|
||||||
|
intent = Intent(Settings.ACTION_SETTINGS)
|
||||||
|
}
|
||||||
|
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||||
|
PendingIntent.FLAG_IMMUTABLE
|
||||||
|
} else {
|
||||||
|
PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
}
|
||||||
|
builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, flags))
|
||||||
|
return builder.build()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2013 The Android Open Source Project
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
package org.traccar.client;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.os.PowerManager;
|
|
||||||
import android.support.v4.content.ContextCompat;
|
|
||||||
import android.util.SparseArray;
|
|
||||||
|
|
||||||
public abstract class WakefulBroadcastReceiver extends BroadcastReceiver {
|
|
||||||
private static final String EXTRA_WAKE_LOCK_ID = "android.support.content.wakelockid";
|
|
||||||
private static final SparseArray<PowerManager.WakeLock> mActiveWakeLocks = new SparseArray<>();
|
|
||||||
private static int mNextId = 1;
|
|
||||||
|
|
||||||
public static void startWakefulForegroundService(Context context, Intent intent) {
|
|
||||||
synchronized (mActiveWakeLocks) {
|
|
||||||
int id = mNextId;
|
|
||||||
mNextId++;
|
|
||||||
if (mNextId <= 0) {
|
|
||||||
mNextId = 1;
|
|
||||||
}
|
|
||||||
intent.putExtra(EXTRA_WAKE_LOCK_ID, id);
|
|
||||||
ContextCompat.startForegroundService(context, intent);
|
|
||||||
PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
|
|
||||||
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
|
|
||||||
WakefulBroadcastReceiver.class.getSimpleName());
|
|
||||||
wl.setReferenceCounted(false);
|
|
||||||
wl.acquire(60*1000);
|
|
||||||
mActiveWakeLocks.put(id, wl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean completeWakefulIntent(Intent intent) {
|
|
||||||
final int id = intent.getIntExtra(EXTRA_WAKE_LOCK_ID, 0);
|
|
||||||
if (id == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
synchronized (mActiveWakeLocks) {
|
|
||||||
PowerManager.WakeLock wl = mActiveWakeLocks.get(id);
|
|
||||||
if (wl != null) {
|
|
||||||
wl.release();
|
|
||||||
mActiveWakeLocks.remove(id);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2021 Anton Tananaev (anton@traccar.org)
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.traccar.client
|
||||||
|
|
||||||
|
import android.content.BroadcastReceiver
|
||||||
|
import android.content.Context
|
||||||
|
import android.util.SparseArray
|
||||||
|
import android.os.PowerManager.WakeLock
|
||||||
|
import android.content.Intent
|
||||||
|
import androidx.core.content.ContextCompat
|
||||||
|
import android.os.PowerManager
|
||||||
|
|
||||||
|
abstract class WakefulBroadcastReceiver : BroadcastReceiver() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private const val EXTRA_WAKE_LOCK_ID = "android.support.content.wakelockid"
|
||||||
|
private val activeWakeLocks = SparseArray<WakeLock>()
|
||||||
|
private var nextId = 1
|
||||||
|
|
||||||
|
fun startWakefulForegroundService(context: Context, intent: Intent) {
|
||||||
|
synchronized(activeWakeLocks) {
|
||||||
|
val id = nextId
|
||||||
|
nextId += 1
|
||||||
|
if (nextId <= 0) {
|
||||||
|
nextId = 1
|
||||||
|
}
|
||||||
|
intent.putExtra(EXTRA_WAKE_LOCK_ID, id)
|
||||||
|
ContextCompat.startForegroundService(context, intent)
|
||||||
|
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||||
|
val wakeLock = powerManager.newWakeLock(
|
||||||
|
PowerManager.PARTIAL_WAKE_LOCK,
|
||||||
|
WakefulBroadcastReceiver::class.java.simpleName
|
||||||
|
)
|
||||||
|
wakeLock.setReferenceCounted(false)
|
||||||
|
wakeLock.acquire((60 * 1000).toLong())
|
||||||
|
activeWakeLocks.put(id, wakeLock)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun completeWakefulIntent(intent: Intent?): Boolean {
|
||||||
|
val id = intent?.getIntExtra(EXTRA_WAKE_LOCK_ID, 0) ?: 0
|
||||||
|
if (id == 0) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
synchronized(activeWakeLocks) {
|
||||||
|
val wakeLock = activeWakeLocks[id]
|
||||||
|
if (wakeLock != null) {
|
||||||
|
wakeLock.release()
|
||||||
|
activeWakeLocks.remove(id)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="fill_parent"
|
|
||||||
android:layout_toRightOf="@+id/logo"
|
|
||||||
android:layout_toEndOf="@+id/logo"
|
|
||||||
android:padding="@dimen/spacing_normal"
|
|
||||||
android:orientation="vertical" >
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/title"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="@dimen/spacing_normal"
|
|
||||||
android:text="@string/app_name"
|
|
||||||
android:textAppearance="?android:attr/textAppearanceLarge" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="@dimen/spacing_normal"
|
|
||||||
android:text="@string/about_description" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginBottom="@dimen/spacing_normal"
|
|
||||||
android:text="@string/about_license" />
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/about_web"
|
|
||||||
android:autoLink="web" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<androidx.fragment.app.FragmentContainerView
|
||||||
|
android:id="@+id/fragment"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:name="org.traccar.client.MainFragment" />
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
app:showAsAction="ifRoom" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/about"
|
android:id="@+id/info"
|
||||||
android:title="@string/menu_about"
|
android:title="@string/menu_info"
|
||||||
app:showAsAction="never" />
|
app:showAsAction="ifRoom" />
|
||||||
|
|
||||||
</menu>
|
</menu>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
<foreground android:drawable="@mipmap/ic_sos_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
<foreground android:drawable="@mipmap/ic_start_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<background android:drawable="@color/white"/>
|
<background android:drawable="@color/light"/>
|
||||||
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
<foreground android:drawable="@mipmap/ic_stop_foreground"/>
|
||||||
</adaptive-icon>
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar-kliënt</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Begin diens</string>
|
||||||
|
<string name="shortcut_stop">Stop diens</string>
|
||||||
|
<string name="shortcut_sos">Stuur SOS</string>
|
||||||
|
<string name="channel_default">Primêre Kanaal</string>
|
||||||
|
<string name="settings_id_title">Toestel-identifiseerder</string>
|
||||||
|
<string name="settings_url_title">Bediener-URL</string>
|
||||||
|
<string name="settings_url_summary">Volg bediener-URL</string>
|
||||||
|
<string name="settings_interval_title">Frekwensie</string>
|
||||||
|
<string name="settings_interval_summary">Rapporteer interval in sekondes</string>
|
||||||
|
<string name="settings_distance_title">Afstand</string>
|
||||||
|
<string name="settings_distance_summary">Rapporteer afstand in meter</string>
|
||||||
|
<string name="settings_angle_title">Hoek</string>
|
||||||
|
<string name="settings_angle_summary">Rapporteringshoek in grade</string>
|
||||||
|
<string name="settings_status_title">Diensstatus</string>
|
||||||
|
<string name="settings_status_off">Begin</string>
|
||||||
|
<string name="settings_status_on">Stop</string>
|
||||||
|
<string name="settings_status_off_summary">Diens gestop</string>
|
||||||
|
<string name="settings_status_on_summary">Diens loop</string>
|
||||||
|
<string name="settings_buffer">Vanlyn buffer</string>
|
||||||
|
<string name="settings_buffer_off_summary">Buffer af</string>
|
||||||
|
<string name="settings_buffer_on_summary">Buffer aan</string>
|
||||||
|
<string name="settings_accuracy_title">Ligging akkuraatheid</string>
|
||||||
|
<string name="settings_accuracy_summary">Verlangde ligging akkuraatheid</string>
|
||||||
|
<string name="settings_accuracy_high">Hoog</string>
|
||||||
|
<string name="settings_accuracy_medium">Medium</string>
|
||||||
|
<string name="settings_accuracy_low">Laag</string>
|
||||||
|
<string name="settings_foreground_title">Voorgrond diens</string>
|
||||||
|
<string name="settings_foreground_summary">Verhoog diensprioriteit</string>
|
||||||
|
<string name="menu_status">Status</string>
|
||||||
|
<string name="menu_shortcuts">Voeg kortpaaie by</string>
|
||||||
|
<string name="menu_clear">Skoonmaak</string>
|
||||||
|
<string name="status_service_create">Diens het begin</string>
|
||||||
|
<string name="status_service_destroy">Diens het gestop</string>
|
||||||
|
<string name="status_send_success">Stuur suksesvol</string>
|
||||||
|
<string name="status_send_fail">Stuur misluk</string>
|
||||||
|
<string name="status_location_update">Ligging opdateer</string>
|
||||||
|
<string name="status_network_online">Netwerk aanlyn</string>
|
||||||
|
<string name="status_network_offline">Netwerk vanlyn</string>
|
||||||
|
<string name="hidden_app_name">Toestelinstellings</string>
|
||||||
|
<string name="hidden_alert">Die toep is versteek. Skakel 8722227 (TRACCAR) om dit weer oop te maak.</string>
|
||||||
|
<string name="error_msg_invalid_url">Voer \'n geldige http: // of https: // URL in</string>
|
||||||
|
</resources>
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">عميل Traccar</string>
|
<string name="app_name">عميل Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">بدء الخدمة</string>
|
||||||
|
<string name="shortcut_stop">توقف الخدمة</string>
|
||||||
|
<string name="shortcut_sos">ارسال استغاثة</string>
|
||||||
|
<string name="channel_default">القناة الاساسية</string>
|
||||||
<string name="settings_id_title">معرف الجهاز</string>
|
<string name="settings_id_title">معرف الجهاز</string>
|
||||||
<string name="settings_url_title">رابط الخادم</string>
|
<string name="settings_url_title">رابط الخادم</string>
|
||||||
<string name="settings_url_summary">رابط خادم التتبع</string>
|
<string name="settings_url_summary">رابط خادم التتبع</string>
|
||||||
@@ -16,25 +20,30 @@
|
|||||||
<string name="settings_status_on">إيقاف</string>
|
<string name="settings_status_on">إيقاف</string>
|
||||||
<string name="settings_status_off_summary">الخدمة توقفت</string>
|
<string name="settings_status_off_summary">الخدمة توقفت</string>
|
||||||
<string name="settings_status_on_summary">الخدمة تعمل</string>
|
<string name="settings_status_on_summary">الخدمة تعمل</string>
|
||||||
<string name="settings_provider_title">موفر الموقع</string>
|
<string name="settings_buffer">التخزين المؤقت دون اتصال</string>
|
||||||
<string name="settings_provider_summary">مصدر بيانات الموقع</string>
|
<string name="settings_buffer_off_summary">التخزين المؤقت غير مفعل</string>
|
||||||
<string name="settings_provider_gps">موفر نظام تحديد الموقع</string>
|
<string name="settings_buffer_on_summary">التخزين المؤقت مفعل</string>
|
||||||
<string name="settings_provider_network">موفر الشبكة</string>
|
<string name="settings_wakelock">قفل الإيقاظ</string>
|
||||||
<string name="settings_provider_mixed">موفر المختلط</string>
|
<string name="settings_wakelock_off_summary">قفل الإيقاظ غير مفعل</string>
|
||||||
|
<string name="settings_wakelock_on_summary">قفل الإيقاظ مفعل</string>
|
||||||
|
<string name="settings_accuracy_title">دقة الموقع</string>
|
||||||
|
<string name="settings_accuracy_summary">دقة الموقع المطلوبة</string>
|
||||||
|
<string name="settings_accuracy_high">مرتفع</string>
|
||||||
|
<string name="settings_accuracy_medium">متوسط</string>
|
||||||
|
<string name="settings_accuracy_low">منخفض</string>
|
||||||
<string name="settings_foreground_title">الخدمة الأمامية</string>
|
<string name="settings_foreground_title">الخدمة الأمامية</string>
|
||||||
<string name="settings_foreground_summary">زيادة أولوية الخدمة</string>
|
<string name="settings_foreground_summary">زيادة أولوية الخدمة</string>
|
||||||
<string name="menu_status">الحالة</string>
|
<string name="menu_status">الحالة</string>
|
||||||
<string name="menu_about">حول</string>
|
|
||||||
<string name="menu_shortcuts">إضافة اختصارات</string>
|
<string name="menu_shortcuts">إضافة اختصارات</string>
|
||||||
<string name="menu_clear">مسح</string>
|
<string name="menu_clear">مسح</string>
|
||||||
<string name="about_description">محدد الموقع في الوقت الفعلي لأجهزة Android. متوافق مع خادم Traccar ونظم تعقب أخرى </string>
|
<string name="status_service_create">بدأت الخدمة</string>
|
||||||
<string name="about_license">هذا التطبيق مجاني ومفتوح المصدر، الكود المصدري مرخص تحت رخصة Apache الإصدار 2.0 و متاح على GitHub.</string>
|
<string name="status_service_destroy">توقفت الخدمة</string>
|
||||||
<string name="about_web">لمزيد من المعلومات زر \nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">تم الإرسال بنجاح</string>
|
<string name="status_send_success">تم الإرسال بنجاح</string>
|
||||||
<string name="status_send_fail">فشل الإرسال</string>
|
<string name="status_send_fail">فشل الإرسال</string>
|
||||||
<string name="status_location_update">تحديث الموقع</string>
|
<string name="status_location_update">تحديث الموقع</string>
|
||||||
<string name="status_connectivity_change">تغير الارتباط</string>
|
<string name="status_network_online">متصل بالشبكة</string>
|
||||||
|
<string name="status_network_offline">غير متصل بالشبكة</string>
|
||||||
<string name="hidden_app_name">إعدادات الجهاز</string>
|
<string name="hidden_app_name">إعدادات الجهاز</string>
|
||||||
<string name="hidden_alert">تم إخفاء التطبيق. لفتحه مجددا رجاءا اتصل بـ8722227 (TRACCAR).</string>
|
<string name="hidden_alert">تم إخفاء التطبيق. لفتحه مجددا رجاءا اتصل بـ8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">أرجو إدخال رابط صحيح http:// أو https://</string>
|
<string name="error_msg_invalid_url">الرجاء إدخال رابط صحيح http:// أو https://</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar müştəri</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">xidmətə başla</string>
|
||||||
|
<string name="shortcut_stop">xidmət dayandırmaq</string>
|
||||||
|
<string name="shortcut_sos">sos göndərin</string>
|
||||||
|
<string name="channel_default">əsas kanal</string>
|
||||||
|
<string name="settings_id_title">Qurğu identifikatoru</string>
|
||||||
|
<string name="settings_url_title">Server URL</string>
|
||||||
|
<string name="settings_url_summary">Tracking server URL</string>
|
||||||
|
<string name="settings_interval_title">Frequency</string>
|
||||||
|
<string name="settings_interval_summary">Saniyə cədvəlləri bildirir</string>
|
||||||
|
<string name="settings_distance_title">Məsafə</string>
|
||||||
|
<string name="settings_distance_summary">Metr ölçən məsafə</string>
|
||||||
|
<string name="settings_angle_title">Angle</string>
|
||||||
|
<string name="settings_angle_summary">Dərəcə dərəcəsi hesabat</string>
|
||||||
|
<string name="settings_status_title">Xidmət vəziyyəti</string>
|
||||||
|
<string name="settings_status_off">Başlamaq</string>
|
||||||
|
<string name="settings_status_on">Dur</string>
|
||||||
|
<string name="settings_status_off_summary">Xidmət dayandı</string>
|
||||||
|
<string name="settings_status_on_summary">Xidmət davam edir</string>
|
||||||
|
<string name="settings_accuracy_title">Yer dəqiqliyi</string>
|
||||||
|
<string name="settings_accuracy_summary">İstədiyiniz yer dəqiqliyi</string>
|
||||||
|
<string name="settings_accuracy_high">Yüksək</string>
|
||||||
|
<string name="settings_accuracy_medium">Orta</string>
|
||||||
|
<string name="settings_accuracy_low">Aşağı</string>
|
||||||
|
<string name="settings_foreground_title">Ön xidməti</string>
|
||||||
|
<string name="settings_foreground_summary">Xidmət prioritetini artırın</string>
|
||||||
|
<string name="menu_status">vəziyyət</string>
|
||||||
|
<string name="menu_shortcuts">Qısa yollar əlavə edin</string>
|
||||||
|
<string name="menu_clear">Aydındır</string>
|
||||||
|
<string name="status_service_create">Xidmət başladı</string>
|
||||||
|
<string name="status_service_destroy">Xidmət dayandı</string>
|
||||||
|
<string name="status_send_success">Uğurla göndərin</string>
|
||||||
|
<string name="status_send_fail">Göndərmə uğursuz oldu</string>
|
||||||
|
<string name="status_location_update">Yer yeniləmə</string>
|
||||||
|
<string name="status_network_online">Şəbəkə online</string>
|
||||||
|
<string name="status_network_offline">Şəbəkə offline</string>
|
||||||
|
<string name="hidden_app_name">Qurğu Ayarları</string>
|
||||||
|
<string name="hidden_alert">The app has been hidden. To open it again please dial 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Please enter a valid http:// or https:// URL</string>
|
||||||
|
</resources>
|
||||||
@@ -2,7 +2,13 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar клиент</string>
|
<string name="app_name">Traccar клиент</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Стартирай услугата</string>
|
||||||
|
<string name="shortcut_stop">Спри услугата</string>
|
||||||
|
<string name="shortcut_sos">Изпрати SOS</string>
|
||||||
|
<string name="channel_default">Основен канал</string>
|
||||||
<string name="settings_id_title">Идентификатор</string>
|
<string name="settings_id_title">Идентификатор</string>
|
||||||
|
<string name="settings_url_title">Адрес на сървъра</string>
|
||||||
|
<string name="settings_url_summary">Адрес на проследяващият сървър</string>
|
||||||
<string name="settings_interval_title">Честота</string>
|
<string name="settings_interval_title">Честота</string>
|
||||||
<string name="settings_interval_summary">Докладван интервал в сек.</string>
|
<string name="settings_interval_summary">Докладван интервал в сек.</string>
|
||||||
<string name="settings_distance_title">Разстояние</string>
|
<string name="settings_distance_title">Разстояние</string>
|
||||||
@@ -14,24 +20,24 @@
|
|||||||
<string name="settings_status_on">Стоп</string>
|
<string name="settings_status_on">Стоп</string>
|
||||||
<string name="settings_status_off_summary">Услугата е спряна</string>
|
<string name="settings_status_off_summary">Услугата е спряна</string>
|
||||||
<string name="settings_status_on_summary">Услугата работи</string>
|
<string name="settings_status_on_summary">Услугата работи</string>
|
||||||
<string name="settings_provider_title">Доставчик на местоположение</string>
|
<string name="settings_accuracy_title">Точност на местоположението</string>
|
||||||
<string name="settings_provider_summary">Източник на данни за местоположението</string>
|
<string name="settings_accuracy_summary">Желана точност на местоположението</string>
|
||||||
<string name="settings_provider_gps">GPS</string>
|
<string name="settings_accuracy_high">Висока</string>
|
||||||
<string name="settings_provider_network">Мрежи</string>
|
<string name="settings_accuracy_medium">Средна</string>
|
||||||
<string name="settings_provider_mixed">Смесен Доставчик</string>
|
<string name="settings_accuracy_low">Ниска</string>
|
||||||
<string name="settings_foreground_title">Foreground service</string>
|
<string name="settings_foreground_title">Foreground service</string>
|
||||||
<string name="settings_foreground_summary">Увеличаване на приоритета на услугата</string>
|
<string name="settings_foreground_summary">Увеличаване на приоритета на услугата</string>
|
||||||
<string name="menu_status">Състояние</string>
|
<string name="menu_status">Състояние</string>
|
||||||
<string name="menu_about">Относно</string>
|
|
||||||
<string name="menu_shortcuts">Добави пряк път</string>
|
<string name="menu_shortcuts">Добави пряк път</string>
|
||||||
<string name="menu_clear">Изтрий</string>
|
<string name="menu_clear">Изтрий</string>
|
||||||
<string name="about_description">Real time GPS tracker for Android devices. Compatible with Traccar Server and other tracking systems.</string>
|
<string name="status_service_create">Услугата стартира</string>
|
||||||
<string name="about_license">This application is free and open source, source code is licensed under Apache License Version 2.0 and available on GitHub.</string>
|
<string name="status_service_destroy">Услугата спряна</string>
|
||||||
<string name="about_web">For more information visit\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Успешно изпращане</string>
|
<string name="status_send_success">Успешно изпращане</string>
|
||||||
<string name="status_send_fail">Грешка в изпращането</string>
|
<string name="status_send_fail">Грешка в изпращането</string>
|
||||||
<string name="status_location_update">Местоположението е обновено</string>
|
<string name="status_location_update">Местоположението е обновено</string>
|
||||||
<string name="status_connectivity_change">Промяна в свързването</string>
|
<string name="status_network_online">Има връзка с мрежата</string>
|
||||||
|
<string name="status_network_offline">Няма връзка с мрежа</string>
|
||||||
<string name="hidden_app_name">Настройки</string>
|
<string name="hidden_app_name">Настройки</string>
|
||||||
<string name="hidden_alert">Приложението е скрито. За да го отворите отново, моля наберете 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Приложението е скрито. За да го отворите отново, моля наберете 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Моля въведете валиден адрес</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -16,24 +16,14 @@
|
|||||||
<string name="settings_status_on">বন্ধ</string>
|
<string name="settings_status_on">বন্ধ</string>
|
||||||
<string name="settings_status_off_summary">সার্ভিস বন্ধ হয়েছে</string>
|
<string name="settings_status_off_summary">সার্ভিস বন্ধ হয়েছে</string>
|
||||||
<string name="settings_status_on_summary">সার্ভিস চলমান</string>
|
<string name="settings_status_on_summary">সার্ভিস চলমান</string>
|
||||||
<string name="settings_provider_title">লোকেশন প্রদানকারী</string>
|
|
||||||
<string name="settings_provider_summary">লোকেশন ডেটা উৎস</string>
|
|
||||||
<string name="settings_provider_gps">জিপিএস প্রদানকারী</string>
|
|
||||||
<string name="settings_provider_network">নেটওয়ার্ক প্রদানকারী</string>
|
|
||||||
<string name="settings_provider_mixed">মিশ্র প্রদানকারী</string>
|
|
||||||
<string name="settings_foreground_title">ফোরগ্রাউন্ড সার্ভিস</string>
|
<string name="settings_foreground_title">ফোরগ্রাউন্ড সার্ভিস</string>
|
||||||
<string name="settings_foreground_summary">সার্ভিসের পূর্ববর্তিতা বৃদ্ধি</string>
|
<string name="settings_foreground_summary">সার্ভিসের পূর্ববর্তিতা বৃদ্ধি</string>
|
||||||
<string name="menu_status">অবস্থা</string>
|
<string name="menu_status">অবস্থা</string>
|
||||||
<string name="menu_about">সম্পর্কে / সম্বন্ধে</string>
|
|
||||||
<string name="menu_shortcuts">শর্টকাট যুক্ত করা</string>
|
<string name="menu_shortcuts">শর্টকাট যুক্ত করা</string>
|
||||||
<string name="menu_clear">পরিষ্কার</string>
|
<string name="menu_clear">পরিষ্কার</string>
|
||||||
<string name="about_description">অ্যান্ড্রয়েড ডিভাইসের জন্য রিয়েল টাইম GPS ট্র্যাকার। Traccar সার্ভার এবং অন্যান্য ট্র্যাকিং সিস্টেমগুলির সাথে সামঞ্জস্যপূর্ণ।</string>
|
|
||||||
<string name="about_license">এই অ্যাপ্লিকেশনটি বিনামূল্যে প্রদানকৃত এবং ওপেন সোর্স, সোর্স কোডটি Apache License Version 2.0 এর অধীনে লাইসেন্স করা এবং GitHub এ রক্ষিত।</string>
|
|
||||||
<string name="about_web">আরও তথ্যের জন্য www.traccar.org/client দেখুন</string>
|
|
||||||
<string name="status_send_success">সফলভাবে পাঠান হয়েছে</string>
|
<string name="status_send_success">সফলভাবে পাঠান হয়েছে</string>
|
||||||
<string name="status_send_fail">পাঠান ব্যর্থ হয়েছে</string>
|
<string name="status_send_fail">পাঠান ব্যর্থ হয়েছে</string>
|
||||||
<string name="status_location_update">অবস্থান আপডেট</string>
|
<string name="status_location_update">অবস্থান আপডেট</string>
|
||||||
<string name="status_connectivity_change">সংযোগ পরিবর্তন হয়েছে</string>
|
|
||||||
<string name="hidden_app_name">ডিভাইস সেটিংস</string>
|
<string name="hidden_app_name">ডিভাইস সেটিংস</string>
|
||||||
<string name="hidden_alert">অ্যাপ্লিকেশনটি লুকানো আছে। আবার খুলতে ডায়াল করুন 8722227 (TRACCAR)।</string>
|
<string name="hidden_alert">অ্যাপ্লিকেশনটি লুকানো আছে। আবার খুলতে ডায়াল করুন 8722227 (TRACCAR)।</string>
|
||||||
<string name="error_msg_invalid_url">দয়া করে একটি ভ্যালিড http:// বা https:// URL লিখুন</string>
|
<string name="error_msg_invalid_url">দয়া করে একটি ভ্যালিড http:// বা https:// URL লিখুন</string>
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar Client</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Inicia servei</string>
|
||||||
|
<string name="shortcut_stop">Atura servei</string>
|
||||||
|
<string name="shortcut_sos">Envia SOS</string>
|
||||||
|
<string name="channel_default">Canal principal</string>
|
||||||
|
<string name="settings_id_title">Id dispositiu</string>
|
||||||
|
<string name="settings_url_title">URL Servidor</string>
|
||||||
|
<string name="settings_url_summary">URL del servidor de seguiment</string>
|
||||||
|
<string name="settings_interval_title">Interval</string>
|
||||||
|
<string name="settings_interval_summary">Interval d\'enviament en segons</string>
|
||||||
|
<string name="settings_distance_title">Distància</string>
|
||||||
|
<string name="settings_distance_summary">Distància en metres per informar</string>
|
||||||
|
<string name="settings_angle_title">Angle</string>
|
||||||
|
<string name="settings_angle_summary">Graus de diferència per informar</string>
|
||||||
|
<string name="settings_status_title">Estat del servei</string>
|
||||||
|
<string name="settings_status_off">Aturat</string>
|
||||||
|
<string name="settings_status_on">Inciat</string>
|
||||||
|
<string name="settings_status_off_summary">Servei aturat</string>
|
||||||
|
<string name="settings_status_on_summary">Servei iniciat</string>
|
||||||
|
<string name="settings_buffer">Buffer</string>
|
||||||
|
<string name="settings_buffer_off_summary">Buffer desactivat</string>
|
||||||
|
<string name="settings_buffer_on_summary">Buffer activat</string>
|
||||||
|
<string name="settings_wakelock">Bloca despertar</string>
|
||||||
|
<string name="settings_wakelock_off_summary">Bloca despertar desactivat</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Bloca despertar activat</string>
|
||||||
|
<string name="settings_accuracy_title">Precisió</string>
|
||||||
|
<string name="settings_accuracy_summary">Precisió</string>
|
||||||
|
<string name="settings_accuracy_high">Precisió alta</string>
|
||||||
|
<string name="settings_accuracy_medium">Precisió mitjana</string>
|
||||||
|
<string name="settings_accuracy_low">Precisió baixa</string>
|
||||||
|
<string name="settings_foreground_title">Primer pla</string>
|
||||||
|
<string name="settings_foreground_summary">En primer pla</string>
|
||||||
|
<string name="menu_status">Estat</string>
|
||||||
|
<string name="menu_info">Informació</string>
|
||||||
|
<string name="menu_shortcuts">Dreceres</string>
|
||||||
|
<string name="menu_clear">Netejar</string>
|
||||||
|
<string name="status_service_create">Servei iniciat</string>
|
||||||
|
<string name="status_service_destroy">Servei aturat</string>
|
||||||
|
<string name="status_send_success">Enviat correctament</string>
|
||||||
|
<string name="status_send_fail">Error a l\'enviar</string>
|
||||||
|
<string name="status_location_update">Actualització de localització</string>
|
||||||
|
<string name="status_network_online">Xarxa en línia</string>
|
||||||
|
<string name="status_network_offline">Xarxa fora de línia</string>
|
||||||
|
<string name="hidden_app_name">Configuració del dispositiu</string>
|
||||||
|
<string name="hidden_alert">Aplicació ocultada. Per obrir-la de nou escriviu 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Adreça URL incorrecte</string>
|
||||||
|
<string name="request_exception">Per obtenir contínuament les dades de localització, desactivi la optimització de la bateria per aquesta aplicació</string>
|
||||||
|
<string name="request_background">Per obtenir contínuament les dades de localització, activi el permís \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permetre tot el temps</string>
|
||||||
|
</resources>
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar klient</string>
|
<string name="app_name">Traccar klient</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Spustit službu</string>
|
||||||
|
<string name="shortcut_stop">Zastavit službu</string>
|
||||||
|
<string name="shortcut_sos">Odeslat SOS</string>
|
||||||
|
<string name="channel_default">Primární kanál</string>
|
||||||
<string name="settings_id_title">Identifikátor zařízení</string>
|
<string name="settings_id_title">Identifikátor zařízení</string>
|
||||||
<string name="settings_url_title">URL serveru</string>
|
<string name="settings_url_title">URL serveru</string>
|
||||||
<string name="settings_url_summary">URL sledovacího serveru</string>
|
<string name="settings_url_summary">URL sledovacího serveru</string>
|
||||||
@@ -16,25 +20,34 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Zastaveno</string>
|
<string name="settings_status_off_summary">Zastaveno</string>
|
||||||
<string name="settings_status_on_summary">Spuštěno</string>
|
<string name="settings_status_on_summary">Spuštěno</string>
|
||||||
<string name="settings_provider_title">Poskytovatel zaměření</string>
|
<string name="settings_buffer">Ukládání do vyrovnávací paměti</string>
|
||||||
<string name="settings_provider_summary">Zdroj zaměřovacích dat</string>
|
<string name="settings_buffer_off_summary">Vyrovnávací pamět vypnuta</string>
|
||||||
<string name="settings_provider_gps">GPS</string>
|
<string name="settings_buffer_on_summary">Vyrovnávací pamět zapnuta</string>
|
||||||
<string name="settings_provider_network">Mobilní síť</string>
|
<string name="settings_wakelock">Zámek probuzení</string>
|
||||||
<string name="settings_provider_mixed">Obojí</string>
|
<string name="settings_wakelock_off_summary">Zámek probuzení vypnut</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Zámek probuzení zapnut</string>
|
||||||
|
<string name="settings_accuracy_title">Přesnost umístění</string>
|
||||||
|
<string name="settings_accuracy_summary">Požadovaná přesnost umístění</string>
|
||||||
|
<string name="settings_accuracy_high">Vysoká</string>
|
||||||
|
<string name="settings_accuracy_medium">Střední</string>
|
||||||
|
<string name="settings_accuracy_low">Nízká</string>
|
||||||
<string name="settings_foreground_title">Popředí služba</string>
|
<string name="settings_foreground_title">Popředí služba</string>
|
||||||
<string name="settings_foreground_summary">Zvýšit prioritu služba</string>
|
<string name="settings_foreground_summary">Zvýšit prioritu služba</string>
|
||||||
<string name="menu_status">Stav</string>
|
<string name="menu_status">Stav</string>
|
||||||
<string name="menu_about">O aplikaci</string>
|
<string name="menu_info">Informace</string>
|
||||||
<string name="menu_shortcuts">Přidat zástupce</string>
|
<string name="menu_shortcuts">Přidat zástupce</string>
|
||||||
<string name="menu_clear">Vyčistit</string>
|
<string name="menu_clear">Vyčistit</string>
|
||||||
<string name="about_description">GPS sledovací aplikace pracující v reálném čase pro zařízení s operačním systémem Android. Kompatibilní s Traccar serverem a dalšími sledovacími systémy.</string>
|
<string name="status_service_create">Služba spuštěna</string>
|
||||||
<string name="about_license">Tato aplikace je zdarma a open source, zdrojový kód je licencován pod Apache License Version 2.0 a je přístupný na GitHub.</string>
|
<string name="status_service_destroy">Služba zastavena</string>
|
||||||
<string name="about_web">Pro více informací navštivte\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Úspěšně odesláno</string>
|
<string name="status_send_success">Úspěšně odesláno</string>
|
||||||
<string name="status_send_fail">Odesílání selhalo</string>
|
<string name="status_send_fail">Odesílání selhalo</string>
|
||||||
<string name="status_location_update">Aktualizace pozice</string>
|
<string name="status_location_update">Aktualizace pozice</string>
|
||||||
<string name="status_connectivity_change">Změna připojení</string>
|
<string name="status_network_online">Síť online</string>
|
||||||
|
<string name="status_network_offline">Síť offile</string>
|
||||||
<string name="hidden_app_name">Nastavení zařízení</string>
|
<string name="hidden_app_name">Nastavení zařízení</string>
|
||||||
<string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Aplikace byla skryta. Pro znovuotevření vytočte 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string>
|
<string name="error_msg_invalid_url">Prosím vložte platnou http:// nebo https:// URL</string>
|
||||||
|
<string name="request_exception">Chcete-li průběžně shromažďovat údaje o poloze, vypněte optimalizaci baterie pro aplikaci.</string>
|
||||||
|
<string name="request_background">Chcete-li průběžně shromažďovat údaje o poloze, zapněte \"%s\" oprávnění.</string>
|
||||||
|
<string name="request_background_option">Povolit po celou dobu</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,39 +2,48 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar klient</string>
|
<string name="app_name">Traccar klient</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Start tjenesten</string>
|
||||||
|
<string name="shortcut_stop">Stop tjenesten</string>
|
||||||
|
<string name="shortcut_sos">Send SOS</string>
|
||||||
|
<string name="channel_default">Primær kanal</string>
|
||||||
<string name="settings_id_title">Enheds ID</string>
|
<string name="settings_id_title">Enheds ID</string>
|
||||||
<string name="settings_url_title">Server Adresse</string>
|
<string name="settings_url_title">Server Adresse</string>
|
||||||
<string name="settings_url_summary">Tracking server adresse</string>
|
<string name="settings_url_summary">Tracking server adresse</string>
|
||||||
<string name="settings_interval_title">Tracking interval</string>
|
<string name="settings_interval_title">Periode mellem registreringer</string>
|
||||||
<string name="settings_interval_summary">Rapporterings interval i sekunder</string>
|
<string name="settings_interval_summary">Angiv periode i sekunder</string>
|
||||||
<string name="settings_distance_title">Distance</string>
|
<string name="settings_distance_title">Afstand mellem registreringer</string>
|
||||||
<string name="settings_distance_summary">Rapportering distance i meter</string>
|
<string name="settings_distance_summary">Angiv afstand i meter</string>
|
||||||
<string name="settings_angle_title">vinkel</string>
|
<string name="settings_angle_title">Retningsændring som udløser ny registrering</string>
|
||||||
<string name="settings_angle_summary">Rapportering i grader</string>
|
<string name="settings_angle_summary">Angiv retningsændring i grader</string>
|
||||||
<string name="settings_status_title">Service status</string>
|
<string name="settings_status_title">Status af tjenesten</string>
|
||||||
<string name="settings_status_off">Start</string>
|
<string name="settings_status_off">Start</string>
|
||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Service stoppet</string>
|
<string name="settings_status_off_summary">Tjenesten stoppet</string>
|
||||||
<string name="settings_status_on_summary">Service er aktiv</string>
|
<string name="settings_status_on_summary">Tjenesten er aktiv</string>
|
||||||
<string name="settings_provider_title">Udbyder</string>
|
<string name="settings_buffer">Offline buffering</string>
|
||||||
<string name="settings_provider_summary">Udbyder lokaliseringsdata</string>
|
<string name="settings_buffer_off_summary">buffering off</string>
|
||||||
<string name="settings_provider_gps">GPS udbyder</string>
|
<string name="settings_buffer_on_summary">buffering on</string>
|
||||||
<string name="settings_provider_network">Netværks udbyder</string>
|
<string name="settings_wakelock">Vågelås</string>
|
||||||
<string name="settings_provider_mixed">Mixet udbyder</string>
|
<string name="settings_wakelock_off_summary">Vågelås off</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Vågelås on</string>
|
||||||
|
<string name="settings_accuracy_title">Placeringsnøjagtighed</string>
|
||||||
|
<string name="settings_accuracy_summary">Ønsket placeringsnøjagtighed</string>
|
||||||
|
<string name="settings_accuracy_high">Høj</string>
|
||||||
|
<string name="settings_accuracy_medium">Mellem</string>
|
||||||
|
<string name="settings_accuracy_low">Lav</string>
|
||||||
<string name="settings_foreground_title">Forgrunds tjeneste</string>
|
<string name="settings_foreground_title">Forgrunds tjeneste</string>
|
||||||
<string name="settings_foreground_summary">Øg tjeneste prioritet</string>
|
<string name="settings_foreground_summary">Øg tjeneste prioritet</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Om</string>
|
|
||||||
<string name="menu_shortcuts">Tilføj genveje</string>
|
<string name="menu_shortcuts">Tilføj genveje</string>
|
||||||
<string name="menu_clear">Tilbage</string>
|
<string name="menu_clear">Slet</string>
|
||||||
<string name="about_description">Real tid`s GPS tracker for Android enheder. Kompatibel med Traccar Server og andre tracking systemer.</string>
|
<string name="status_service_create">Tjenesten kører</string>
|
||||||
<string name="about_license">Denne application er en fri og open source, source koden er licenseret under Apache License Version 2.0 og tilgængelig på GitHub.</string>
|
<string name="status_service_destroy">Tjenesten er stoppet</string>
|
||||||
<string name="about_web">For mere information besøg\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Send succesfuld</string>
|
<string name="status_send_success">Send succesfuld</string>
|
||||||
<string name="status_send_fail">Send fejlede</string>
|
<string name="status_send_fail">Send fejlede</string>
|
||||||
<string name="status_location_update">Placering opdateret</string>
|
<string name="status_location_update">Placering opdateret</string>
|
||||||
<string name="status_connectivity_change">Connectivity forandring</string>
|
<string name="status_network_online">Netværk online</string>
|
||||||
|
<string name="status_network_offline">Netværk offline</string>
|
||||||
<string name="hidden_app_name">Enheds indstillinger</string>
|
<string name="hidden_app_name">Enheds indstillinger</string>
|
||||||
<string name="hidden_alert">Appen er skjult. For at åbne appen igen skal du ringe til 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Appen er skjult. For at åbne appen igen skal du ringe til 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">Indtast valid http:// eller https:/ adresse</string>
|
<string name="error_msg_invalid_url">Indtast gyldig http:// eller https:// adresse</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,26 +20,26 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Dienst inaktiv</string>
|
<string name="settings_status_off_summary">Dienst inaktiv</string>
|
||||||
<string name="settings_status_on_summary">Dienst aktiv</string>
|
<string name="settings_status_on_summary">Dienst aktiv</string>
|
||||||
<string name="settings_provider_title">Datenherkunft</string>
|
<string name="settings_buffer">Offline puffern</string>
|
||||||
<string name="settings_provider_summary">Quelle der Positionsdaten</string>
|
<string name="settings_buffer_off_summary">Puffern aus</string>
|
||||||
<string name="settings_provider_gps">GPS-Provider</string>
|
<string name="settings_buffer_on_summary">Puffern ein</string>
|
||||||
<string name="settings_provider_network">Netzwerk-Provider</string>
|
<string name="settings_accuracy_title">Positionsgenauigkeit</string>
|
||||||
<string name="settings_provider_mixed">Gemischt</string>
|
<string name="settings_accuracy_summary">Erwünschte Positionsgenauigkeit</string>
|
||||||
|
<string name="settings_accuracy_high">Hoch</string>
|
||||||
|
<string name="settings_accuracy_medium">Mittel</string>
|
||||||
|
<string name="settings_accuracy_low">Niedrig</string>
|
||||||
<string name="settings_foreground_title">Vordergrund Service</string>
|
<string name="settings_foreground_title">Vordergrund Service</string>
|
||||||
<string name="settings_foreground_summary">Servicepriorität erhöhen</string>
|
<string name="settings_foreground_summary">Servicepriorität erhöhen</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Über</string>
|
|
||||||
<string name="menu_shortcuts">Verknüpfung hinzufügen</string>
|
<string name="menu_shortcuts">Verknüpfung hinzufügen</string>
|
||||||
<string name="menu_clear">Leeren</string>
|
<string name="menu_clear">Leeren</string>
|
||||||
<string name="about_description">Echtzeit GPS Ortung für Android Geräte. Kompatibel mit Traccar Server und anderen Ortungsservern.</string>
|
|
||||||
<string name="about_license">Dieses Programm ist frei und Open Source. Es ist unter Apache Lizenz Version 2.0 lizenziert und ist auf GitHub verfügbar.</string>
|
|
||||||
<string name="about_web">Für weitere Informationen besuchen Sie www.traccar.org/client</string>
|
|
||||||
<string name="status_service_create">Dienst gestartet</string>
|
<string name="status_service_create">Dienst gestartet</string>
|
||||||
<string name="status_service_destroy">Dienst gestoppt</string>
|
<string name="status_service_destroy">Dienst gestoppt</string>
|
||||||
<string name="status_send_success">Erfolgreich gesendet</string>
|
<string name="status_send_success">Erfolgreich gesendet</string>
|
||||||
<string name="status_send_fail">Übertragung fehlerhaft</string>
|
<string name="status_send_fail">Übertragung fehlerhaft</string>
|
||||||
<string name="status_location_update">Positionsupdate</string>
|
<string name="status_location_update">Positionsupdate</string>
|
||||||
<string name="status_connectivity_change">Anschlusswechsel</string>
|
<string name="status_network_online">Netzwerk online</string>
|
||||||
|
<string name="status_network_offline">Netzwerk offline</string>
|
||||||
<string name="hidden_app_name">Geräteeinstellungen</string>
|
<string name="hidden_app_name">Geräteeinstellungen</string>
|
||||||
<string name="hidden_alert">Die App wurde versteckt. Um sie wieder zu öffnen, wähle 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Die App wurde versteckt. Um sie wieder zu öffnen, wähle 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Bitte eine gültige http:// oder https:// URL eingeben</string>
|
<string name="error_msg_invalid_url">Bitte eine gültige http:// oder https:// URL eingeben</string>
|
||||||
|
|||||||
@@ -1,31 +1,53 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">πελάτης Traccar</string>
|
<string name="app_name">Εφαρμογή Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Εκκίνηση υπηρεσίας</string>
|
||||||
|
<string name="shortcut_stop">Διακοπή υπηρεσίας</string>
|
||||||
|
<string name="shortcut_sos">Αποστολή SOS</string>
|
||||||
|
<string name="channel_default">Κύριο κανάλι</string>
|
||||||
<string name="settings_id_title">Αναγνωριστικό συσκευής</string>
|
<string name="settings_id_title">Αναγνωριστικό συσκευής</string>
|
||||||
|
<string name="settings_url_title">Διεύθυνση διακομιστή</string>
|
||||||
|
<string name="settings_url_summary">Διεύθυνση διακομιστή παρακολούθησης</string>
|
||||||
<string name="settings_interval_title">Συχνότητα</string>
|
<string name="settings_interval_title">Συχνότητα</string>
|
||||||
|
<string name="settings_interval_summary">Διάστημα αναφορών σε δευτερόλεπτα</string>
|
||||||
|
<string name="settings_distance_title">Απόσταση</string>
|
||||||
|
<string name="settings_distance_summary">Απόσταση αναφορών σε μέτρα</string>
|
||||||
|
<string name="settings_angle_title">Γωνία</string>
|
||||||
|
<string name="settings_angle_summary">Γωνία αναφορών σε μοίρες</string>
|
||||||
<string name="settings_status_title">Κατάσταση υπηρεσίας</string>
|
<string name="settings_status_title">Κατάσταση υπηρεσίας</string>
|
||||||
<string name="settings_status_off">Εκκίνηση</string>
|
<string name="settings_status_off">Εκκίνηση</string>
|
||||||
<string name="settings_status_on">Παύση</string>
|
<string name="settings_status_on">Παύση</string>
|
||||||
<string name="settings_status_off_summary">Η υπηρεσία σταμάτησε</string>
|
<string name="settings_status_off_summary">Η υπηρεσία σταμάτησε</string>
|
||||||
<string name="settings_status_on_summary">Η υπηρεσία εκτελείται</string>
|
<string name="settings_status_on_summary">Η υπηρεσία εκτελείται</string>
|
||||||
<string name="settings_provider_title">Παροχέας τοποθεσίας</string>
|
<string name="settings_buffer">Εκτός σύνδεσης ενδιάμεση αποθήκευση</string>
|
||||||
<string name="settings_provider_summary">Πηγή δεδομένων τοποθεσίας</string>
|
<string name="settings_buffer_off_summary">Ενδιάμεση αποθήκευση απενεργοποιημένη</string>
|
||||||
<string name="settings_provider_gps">Παροχή GPS</string>
|
<string name="settings_buffer_on_summary">Ενδιάμεση αποθήκευση ενεργοποιημένη</string>
|
||||||
<string name="settings_provider_network">Παροχή δικτύου</string>
|
<string name="settings_wakelock">Κλείδωμα αφύπνισης</string>
|
||||||
<string name="settings_provider_mixed">Μεικτή παροχή</string>
|
<string name="settings_wakelock_off_summary">Κλείδωμα αφύπνισης απενεργοποιημένο</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Κλείδωμα αφύπνισης ενεργοποιημένο</string>
|
||||||
|
<string name="settings_accuracy_title">Ακρίβεια θέσης</string>
|
||||||
|
<string name="settings_accuracy_summary">Επιθυμητή ακρίβεια θέσης</string>
|
||||||
|
<string name="settings_accuracy_high">Υψηλή</string>
|
||||||
|
<string name="settings_accuracy_medium">Μέση</string>
|
||||||
|
<string name="settings_accuracy_low">Χαμηλή</string>
|
||||||
<string name="settings_foreground_title">Υπηρεσία προσκηνίου</string>
|
<string name="settings_foreground_title">Υπηρεσία προσκηνίου</string>
|
||||||
<string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string>
|
<string name="settings_foreground_summary">Αύξηση προτεραιότητας της υπηρεσίας</string>
|
||||||
<string name="menu_status">Κατάσταση</string>
|
<string name="menu_status">Κατάσταση</string>
|
||||||
<string name="menu_about">Περί</string>
|
<string name="menu_info">Πληροφορίες</string>
|
||||||
<string name="menu_shortcuts">Προσθήκη συντόμευσης</string>
|
<string name="menu_shortcuts">Προσθήκη συντόμευσης</string>
|
||||||
<string name="menu_clear">Καθαρισμός</string>
|
<string name="menu_clear">Καθαρισμός</string>
|
||||||
<string name="about_description">GPS ιχνηλάτης πραγματικού χρόνου για συσκευές Android. Συμβατός με Traccar και άλλα συστήματα ιχνηλάτησης.</string>
|
<string name="status_service_create">Η υπηρεσία εκκινήθηκε</string>
|
||||||
<string name="about_license">Εφαρμογή Ελεύθερου και Ανοικτού κώδικα. Ο πηγαίος κώδικας παρέχεται με άδεια Apache 2.0 και διατίθεται στο GitHub.</string>
|
<string name="status_service_destroy">Η υπηρεσία διακόπηκε</string>
|
||||||
<string name="about_web">Για περισσότερες πληροφορίες επισκεφτείτε\nwww.traccar.org/client</string>
|
<string name="status_send_success">Απεστάλη επιτυχώς</string>
|
||||||
<string name="status_send_fail">Αποτυχημένη αποστολή</string>
|
<string name="status_send_fail">Η αποστολή απέτυχε</string>
|
||||||
<string name="status_location_update">Ενημέρωση τοποθεσίας</string>
|
<string name="status_location_update">Ενημέρωση τοποθεσίας</string>
|
||||||
<string name="status_connectivity_change">Αλλαγή στη διασύνδεση</string>
|
<string name="status_network_online">Ενεργό δίκτυο</string>
|
||||||
|
<string name="status_network_offline">Ανενεργό δίκτυο</string>
|
||||||
<string name="hidden_app_name">Ρυθμίσεις συσκευής</string>
|
<string name="hidden_app_name">Ρυθμίσεις συσκευής</string>
|
||||||
<string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Η εφαρμογή αποκρύφτηκε. Για να προβληθεί καλέστε 8722227 (TRACCAR)</string>
|
||||||
|
<string name="error_msg_invalid_url">Παρακαλώ εισάγετε μία έγκυρη http:// ή https:// διεύθυνση</string>
|
||||||
|
<string name="request_exception">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας απενεργοποιήστε την βελτιστοποίηση μπαταρίας για την εφαρμογή.</string>
|
||||||
|
<string name="request_background">Για να συλλέγετε συνεχώς δεδομένα τοποθεσίας ενεργοποιήστε την επιλογή \"%s\".</string>
|
||||||
|
<string name="request_background_option">Να επιτρέπεται όλη την ώρα</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Cliente Traccar</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Iniciar servicio</string>
|
||||||
|
<string name="shortcut_stop">Detener servicio</string>
|
||||||
|
<string name="shortcut_sos">Enviar SOS</string>
|
||||||
|
<string name="channel_default">Canal primario</string>
|
||||||
<string name="settings_id_title">Identificador de dispositivo</string>
|
<string name="settings_id_title">Identificador de dispositivo</string>
|
||||||
<string name="settings_url_title">URL del servidor</string>
|
<string name="settings_url_title">URL del servidor</string>
|
||||||
<string name="settings_url_summary">URL del servidor de seguimiento</string>
|
<string name="settings_url_summary">URL del servidor de seguimiento</string>
|
||||||
@@ -12,30 +16,38 @@
|
|||||||
<string name="settings_angle_title">Ángulo</string>
|
<string name="settings_angle_title">Ángulo</string>
|
||||||
<string name="settings_angle_summary">Ángulo para reportes en grados</string>
|
<string name="settings_angle_summary">Ángulo para reportes en grados</string>
|
||||||
<string name="settings_status_title">Estado del servicio</string>
|
<string name="settings_status_title">Estado del servicio</string>
|
||||||
<string name="settings_status_off">Activado</string>
|
<string name="settings_status_off">Activar</string>
|
||||||
<string name="settings_status_on">Desactivado</string>
|
<string name="settings_status_on">Desactivar</string>
|
||||||
<string name="settings_status_off_summary">Servicio detenido</string>
|
<string name="settings_status_off_summary">Servicio detenido</string>
|
||||||
<string name="settings_status_on_summary">Servicio en ejecución</string>
|
<string name="settings_status_on_summary">Servicio en ejecución</string>
|
||||||
<string name="settings_provider_title">Proveedor de localización</string>
|
<string name="settings_buffer">Búfer fuera de línea</string>
|
||||||
<string name="settings_provider_summary">Fuente de los datos de localización</string>
|
<string name="settings_buffer_off_summary">Búfer activado</string>
|
||||||
<string name="settings_provider_gps">Proveedor GPS</string>
|
<string name="settings_buffer_on_summary">Búfer desactivado</string>
|
||||||
<string name="settings_provider_network">Proveedor de red</string>
|
<string name="settings_wakelock">Estado despierto forzado</string>
|
||||||
<string name="settings_provider_mixed">Proveedor mixto</string>
|
<string name="settings_wakelock_off_summary">Estado despierto forzado activado</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Estado despierto forzado desactivado</string>
|
||||||
|
<string name="settings_accuracy_title">Precisión de posición</string>
|
||||||
|
<string name="settings_accuracy_summary">Precisión de posición deseada</string>
|
||||||
|
<string name="settings_accuracy_high">Alta</string>
|
||||||
|
<string name="settings_accuracy_medium">Media</string>
|
||||||
|
<string name="settings_accuracy_low">Baja</string>
|
||||||
<string name="settings_foreground_title">Servicio en primer plano</string>
|
<string name="settings_foreground_title">Servicio en primer plano</string>
|
||||||
<string name="settings_foreground_summary">Aumentar prioridad del servicio</string>
|
<string name="settings_foreground_summary">Aumentar prioridad del servicio</string>
|
||||||
<string name="menu_status">Estado</string>
|
<string name="menu_status">Estado</string>
|
||||||
<string name="menu_about">Acerca de…</string>
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Añadir acceso directo</string>
|
<string name="menu_shortcuts">Añadir acceso directo</string>
|
||||||
<string name="menu_clear">Limpiar</string>
|
<string name="menu_clear">Limpiar</string>
|
||||||
<string name="about_description">Rastreador GPS en tiempo real para dispositivos Android. Compatible con Servidor Traccar y otros sistemas de rastreo.</string>
|
<string name="status_service_create">Servicio iniciado</string>
|
||||||
<string name="about_license">Esta aplición es gratuíta y de código abierto. El código fuente está bajo la Licencia Apache Versión 2 y disponible en Github.</string>
|
<string name="status_service_destroy">Servicio detenido</string>
|
||||||
<string name="about_web">Para más información visite
|
|
||||||
www.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Enviado correctamente</string>
|
<string name="status_send_success">Enviado correctamente</string>
|
||||||
<string name="status_send_fail">Falló el envío</string>
|
<string name="status_send_fail">Fallo en el envío</string>
|
||||||
<string name="status_location_update">Actualización de localización</string>
|
<string name="status_location_update">Actualización de localización</string>
|
||||||
<string name="status_connectivity_change">Cambio en la conectividad</string>
|
<string name="status_network_online">Red en línea</string>
|
||||||
|
<string name="status_network_offline">Red fuera de línea</string>
|
||||||
<string name="hidden_app_name">Ajustes del dispositivo</string>
|
<string name="hidden_app_name">Ajustes del dispositivo</string>
|
||||||
<string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">La aplicación se ha ocultado. Para abrirla de nuevo por favor marque 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Por favor. Introduzca una URL válida http:// ó https:// </string>
|
<string name="error_msg_invalid_url">Por favor, introduzca una URL válida http:// ó https:// </string>
|
||||||
|
<string name="request_exception">Para recoger continuamente los datos de localización, desactiva la optimización de la batería de la aplicación.</string>
|
||||||
|
<string name="request_background">Para recoger continuamente los datos de localización, por favor, activa el permiso \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permitir todo el tiempo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">ردیاب Traccar</string>
|
<string name="app_name">ردیاب Traccar</string>
|
||||||
<string name="app_logo">ردیاب Traccar</string>
|
<string name="app_logo">ردیاب Traccar</string>
|
||||||
|
<string name="shortcut_start">شروع کار</string>
|
||||||
|
<string name="shortcut_stop">توقف کار</string>
|
||||||
|
<string name="shortcut_sos">ارسال پیام اضطراری</string>
|
||||||
|
<string name="channel_default">شبکه اولیه</string>
|
||||||
<string name="settings_id_title">کد هویت دستگاه</string>
|
<string name="settings_id_title">کد هویت دستگاه</string>
|
||||||
<string name="settings_url_title">مسیر آدرس سرور</string>
|
<string name="settings_url_title">مسیر آدرس سرور</string>
|
||||||
<string name="settings_url_summary">مسیر آدرس سرور مسیریاب</string>
|
<string name="settings_url_summary">مسیر آدرس سرور مسیریاب</string>
|
||||||
@@ -16,25 +20,23 @@
|
|||||||
<string name="settings_status_on">توقف</string>
|
<string name="settings_status_on">توقف</string>
|
||||||
<string name="settings_status_off_summary">سرویس متوقف است</string>
|
<string name="settings_status_off_summary">سرویس متوقف است</string>
|
||||||
<string name="settings_status_on_summary">سرویس در حال کار است</string>
|
<string name="settings_status_on_summary">سرویس در حال کار است</string>
|
||||||
<string name="settings_provider_title">ارائه مکان</string>
|
<string name="settings_accuracy_title">دقت مکان</string>
|
||||||
<string name="settings_provider_summary">سورس اطلاعات مکان</string>
|
<string name="settings_accuracy_summary">دقت مکان دلخواه</string>
|
||||||
<string name="settings_provider_gps">ارائه GPS</string>
|
<string name="settings_accuracy_high">زیاد</string>
|
||||||
<string name="settings_provider_network">ارائه شبکه اپراتور</string>
|
<string name="settings_accuracy_medium">متوسط</string>
|
||||||
<string name="settings_provider_mixed">ارائه ترکیبی</string>
|
<string name="settings_accuracy_low">کم</string>
|
||||||
<string name="settings_foreground_title">سرویس پیش زمینه</string>
|
<string name="settings_foreground_title">سرویس پیش زمینه</string>
|
||||||
<string name="settings_foreground_summary">افزایش اولویت سرویس</string>
|
<string name="settings_foreground_summary">افزایش اولویت سرویس</string>
|
||||||
<string name="menu_status">وضعیت</string>
|
<string name="menu_status">وضعیت</string>
|
||||||
<string name="menu_about">درباره</string>
|
|
||||||
<string name="menu_shortcuts">ایجاد میانبر</string>
|
<string name="menu_shortcuts">ایجاد میانبر</string>
|
||||||
<string name="menu_clear">پاک کردن</string>
|
<string name="menu_clear">پاک کردن</string>
|
||||||
<string name="about_description">ردیاب زنده GPS برای اندروید . سازگار با سرورهای Traccar و سایر سرورهای ردیاب</string>
|
<string name="status_service_create">کار شروع شد</string>
|
||||||
<string name="about_license">این نرم افزار مجانی و سورس باز تحت لیسانس Apache نگارش 2.0 و فعال در GitHub.</string>
|
<string name="status_service_destroy">کار متوقف شد</string>
|
||||||
<string name="about_web">برای کسب اطلاعات بیشتر به سایت زیر مراجعه نمایید.
|
|
||||||
www.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">ارسال موفق</string>
|
<string name="status_send_success">ارسال موفق</string>
|
||||||
<string name="status_send_fail">ارسال ناموفق</string>
|
<string name="status_send_fail">ارسال ناموفق</string>
|
||||||
<string name="status_location_update">به روز رسانی مکان</string>
|
<string name="status_location_update">به روز رسانی مکان</string>
|
||||||
<string name="status_connectivity_change">تغییرات در ارتباطات</string>
|
<string name="status_network_online">شبکه آنلاین</string>
|
||||||
|
<string name="status_network_offline">شبکه آفلاین</string>
|
||||||
<string name="hidden_app_name">تنظیمات دستگاه</string>
|
<string name="hidden_app_name">تنظیمات دستگاه</string>
|
||||||
<string name="hidden_alert">نرم افزار مخفی است . جهت نمایش آن با این شماره تماس بگیرید.
|
<string name="hidden_alert">نرم افزار مخفی است . جهت نمایش آن با این شماره تماس بگیرید.
|
||||||
8722227 (Traccar)</string>
|
8722227 (Traccar)</string>
|
||||||
|
|||||||
@@ -2,9 +2,13 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
<string name="settings_id_title">Laitteen tunniste</string>
|
<string name="shortcut_start">Käynnistä palvelu</string>
|
||||||
|
<string name="shortcut_stop">Pysäytä palvelu</string>
|
||||||
|
<string name="shortcut_sos">Lähetä SOS-viesti</string>
|
||||||
|
<string name="channel_default">Ensisijainen kanava</string>
|
||||||
|
<string name="settings_id_title">Laitteen ID</string>
|
||||||
<string name="settings_url_title">Palvelimen URL</string>
|
<string name="settings_url_title">Palvelimen URL</string>
|
||||||
<string name="settings_url_summary">Jäljityspalvelimen URL-osoite</string>
|
<string name="settings_url_summary">Paikannuspalvelimen URL-osoite</string>
|
||||||
<string name="settings_interval_title">Taajuus</string>
|
<string name="settings_interval_title">Taajuus</string>
|
||||||
<string name="settings_interval_summary">Raportointiväli sekunneissa</string>
|
<string name="settings_interval_summary">Raportointiväli sekunneissa</string>
|
||||||
<string name="settings_distance_title">Matka</string>
|
<string name="settings_distance_title">Matka</string>
|
||||||
@@ -16,23 +20,34 @@
|
|||||||
<string name="settings_status_on">Pysäytä</string>
|
<string name="settings_status_on">Pysäytä</string>
|
||||||
<string name="settings_status_off_summary">Palvelu pysäytetty</string>
|
<string name="settings_status_off_summary">Palvelu pysäytetty</string>
|
||||||
<string name="settings_status_on_summary">Palvelu käynnissä</string>
|
<string name="settings_status_on_summary">Palvelu käynnissä</string>
|
||||||
<string name="settings_provider_title">Sijainnin tarjoaja</string>
|
<string name="settings_buffer">Offline-puskurointi</string>
|
||||||
<string name="settings_provider_summary">Sijaintidatan lähde</string>
|
<string name="settings_buffer_off_summary">Puskurointi pois päältä</string>
|
||||||
<string name="settings_provider_gps">GPS satelliiti</string>
|
<string name="settings_buffer_on_summary">Puskurointi päälle</string>
|
||||||
<string name="settings_provider_network">Matkapuhelinverkko</string>
|
<string name="settings_wakelock">Lepotilalukko</string>
|
||||||
<string name="settings_provider_mixed">Yhdistelmä</string>
|
<string name="settings_wakelock_off_summary">Lepotilalukko pois päältä</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Lepotilalukko päällä</string>
|
||||||
|
<string name="settings_accuracy_title">Sijainnin tarkkuus</string>
|
||||||
|
<string name="settings_accuracy_summary">Haluttu sijainnin tarkkuus</string>
|
||||||
|
<string name="settings_accuracy_high">Korkea</string>
|
||||||
|
<string name="settings_accuracy_medium">Keskitasoinen</string>
|
||||||
|
<string name="settings_accuracy_low">Matala</string>
|
||||||
|
<string name="settings_foreground_title">Edustapalvelu</string>
|
||||||
|
<string name="settings_foreground_summary">Lisää palvelun prioriteettia</string>
|
||||||
<string name="menu_status">Tila</string>
|
<string name="menu_status">Tila</string>
|
||||||
<string name="menu_about">About</string>
|
<string name="menu_info">Tiedot</string>
|
||||||
<string name="menu_shortcuts">Lisää pikakuvakkeet</string>
|
<string name="menu_shortcuts">Lisää pikakuvakkeet</string>
|
||||||
<string name="menu_clear">Tyhjennä</string>
|
<string name="menu_clear">Tyhjennä</string>
|
||||||
<string name="about_description">Reaaliaikainen GPS-jäljitin Android-laitteille. Yhteensopiva Traccar Serverin ja muiden jäljitysjärjestelmien kanssa.</string>
|
<string name="status_service_create">Palvelu käynnistynyt</string>
|
||||||
<string name="about_license">Tämä sovellus on vapaata ja avointa lähdekoodia. Lähdekoodi on lisensoitu Apache License Version 2.0 -lisenssillä ja on saatavilla GitHubissa.</string>
|
<string name="status_service_destroy">Palvelu pysähtyi</string>
|
||||||
<string name="about_web">Lisätietoa on osoitteessa\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Lähetys onnistui</string>
|
<string name="status_send_success">Lähetys onnistui</string>
|
||||||
<string name="status_send_fail">Lähetys epäonnistui</string>
|
<string name="status_send_fail">Lähetys epäonnistui</string>
|
||||||
<string name="status_location_update">Sijainnin päivitys</string>
|
<string name="status_location_update">Sijainnin päivitys</string>
|
||||||
<string name="status_connectivity_change">Muutos yhteydessä</string>
|
<string name="status_network_online">Yhdistetty verkkoon</string>
|
||||||
|
<string name="status_network_offline">Verkkoyhteys katkennut</string>
|
||||||
<string name="hidden_app_name">Laitteen asetukset</string>
|
<string name="hidden_app_name">Laitteen asetukset</string>
|
||||||
<string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string>
|
<string name="hidden_alert">Sovellus on piilotettu. Näppäile 8722227 (TRACCAR) avataksesi sovelluksen uudelleen.</string>
|
||||||
<string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string>
|
<string name="error_msg_invalid_url">Syötä kelvollinen http:// tai https:// URL-osoite</string>
|
||||||
|
<string name="request_exception">Kerätäksesi jatkuvasti sijaintitietoa, poista akun optimointi käytöstä tältä sovellukselta.</string>
|
||||||
|
<string name="request_background">Kerätäksesi jatkuvasti sijaintitietoa, salli \"%s\" käyttöoikeus.</string>
|
||||||
|
<string name="request_background_option">Salli kokoajan</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Client Traccar</string>
|
<string name="app_name">Client Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Démarrer le service</string>
|
||||||
|
<string name="shortcut_stop">Arrêter le service</string>
|
||||||
|
<string name="shortcut_sos">Envoyer un SOS</string>
|
||||||
|
<string name="channel_default">Canal primaire</string>
|
||||||
<string name="settings_id_title">Identifiant de l\'appareil</string>
|
<string name="settings_id_title">Identifiant de l\'appareil</string>
|
||||||
<string name="settings_url_title">URL du serveur</string>
|
<string name="settings_url_title">URL du serveur</string>
|
||||||
<string name="settings_url_summary">URL du serveur de suivi</string>
|
<string name="settings_url_summary">URL du serveur de suivi</string>
|
||||||
@@ -16,24 +20,29 @@
|
|||||||
<string name="settings_status_on">Arrêter</string>
|
<string name="settings_status_on">Arrêter</string>
|
||||||
<string name="settings_status_off_summary">Arrêté</string>
|
<string name="settings_status_off_summary">Arrêté</string>
|
||||||
<string name="settings_status_on_summary">En marche</string>
|
<string name="settings_status_on_summary">En marche</string>
|
||||||
<string name="settings_provider_title">Source de localisation</string>
|
<string name="settings_buffer">Mise en tampon hors ligne</string>
|
||||||
<string name="settings_provider_summary">Source utilisée par le système afin d\'obtenir la localisation de l\'appareil</string>
|
<string name="settings_buffer_off_summary">Mise en tampon désactivée</string>
|
||||||
<string name="settings_provider_gps">Mode GPS uniquement</string>
|
<string name="settings_buffer_on_summary">Mise en tampon activée</string>
|
||||||
<string name="settings_provider_network">Mode cellulaire uniquement</string>
|
<string name="settings_wakelock">Wake lock</string>
|
||||||
<string name="settings_provider_mixed">Mode hybride</string>
|
<string name="settings_wakelock_off_summary">Wake lock off</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Wake lock on</string>
|
||||||
|
<string name="settings_accuracy_title">Precision de la localisation</string>
|
||||||
|
<string name="settings_accuracy_summary">Précision de localisation désirée</string>
|
||||||
|
<string name="settings_accuracy_high">Haut</string>
|
||||||
|
<string name="settings_accuracy_medium">Moyen</string>
|
||||||
|
<string name="settings_accuracy_low">Bas</string>
|
||||||
<string name="settings_foreground_title">Un service de premier plan</string>
|
<string name="settings_foreground_title">Un service de premier plan</string>
|
||||||
<string name="settings_foreground_summary">Augmenter la priorité de service</string>
|
<string name="settings_foreground_summary">Augmenter la priorité de service</string>
|
||||||
<string name="menu_status">Etat</string>
|
<string name="menu_status">Etat</string>
|
||||||
<string name="menu_about">A propos</string>
|
|
||||||
<string name="menu_shortcuts">Ajouter des raccourcis</string>
|
<string name="menu_shortcuts">Ajouter des raccourcis</string>
|
||||||
<string name="menu_clear">Effacer</string>
|
<string name="menu_clear">Effacer</string>
|
||||||
<string name="about_description">Suivi GPS en temps réels pour appareils Android. Compatible avec le serveur Traccar ainsi que d\'autres plateformes de suivi.</string>
|
<string name="status_service_create">Service démarré</string>
|
||||||
<string name="about_license">Cette application open source est gratuite. Le code source est disponible sur GitHub est sous licence Apache Version 2.0.</string>
|
<string name="status_service_destroy">Service arrêté</string>
|
||||||
<string name="about_web">Pour plus d’information, visitez le site: \nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Envoyé avec succès</string>
|
<string name="status_send_success">Envoyé avec succès</string>
|
||||||
<string name="status_send_fail">L’envoi a échoué</string>
|
<string name="status_send_fail">L’envoi a échoué</string>
|
||||||
<string name="status_location_update">Localisation mise à jour</string>
|
<string name="status_location_update">Localisation mise à jour</string>
|
||||||
<string name="status_connectivity_change">Changement de connectivité</string>
|
<string name="status_network_online">Réseau connecté</string>
|
||||||
|
<string name="status_network_offline">Réseau déconnecté</string>
|
||||||
<string name="hidden_app_name">Paramètres de l\'appareil</string>
|
<string name="hidden_app_name">Paramètres de l\'appareil</string>
|
||||||
<string name="hidden_alert">Cette application a été cachée. Pour l\'ouvrir à nouveau, composez le 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Cette application a été cachée. Pour l\'ouvrir à nouveau, composez le 8722227 (TRACCAR)</string>
|
||||||
<string name="error_msg_invalid_url">S\'il vous plait, entrer un URL http:// ou https:// valide</string>
|
<string name="error_msg_invalid_url">S\'il vous plait, entrer un URL http:// ou https:// valide</string>
|
||||||
|
|||||||
@@ -1,30 +1,43 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">שרלוק לאנדרויד</string>
|
<string name="app_name"> Traccar לאנדרויד</string>
|
||||||
<string name="app_logo">שרלוק</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">הפעל שירות </string>
|
||||||
|
<string name="shortcut_stop">עצור תהליך</string>
|
||||||
|
<string name="shortcut_sos">שלח הודעת חירום</string>
|
||||||
|
<string name="channel_default">ערוץ ראשי</string>
|
||||||
<string name="settings_id_title">מזהה מכשיר</string>
|
<string name="settings_id_title">מזהה מכשיר</string>
|
||||||
|
<string name="settings_url_title">כתובת שרת</string>
|
||||||
|
<string name="settings_url_summary">כתובת שרת איתור</string>
|
||||||
<string name="settings_interval_title">תדירות</string>
|
<string name="settings_interval_title">תדירות</string>
|
||||||
|
<string name="settings_interval_summary">זמן דיווח בשניות </string>
|
||||||
|
<string name="settings_distance_title">מרחק</string>
|
||||||
|
<string name="settings_distance_summary">דיווח מרחק במטרים</string>
|
||||||
|
<string name="settings_angle_title">זווית</string>
|
||||||
|
<string name="settings_angle_summary">דיווח פניות בזווית </string>
|
||||||
<string name="settings_status_title">מצב שירות</string>
|
<string name="settings_status_title">מצב שירות</string>
|
||||||
<string name="settings_status_off">הפעל</string>
|
<string name="settings_status_off">הפעל</string>
|
||||||
<string name="settings_status_on">עצור</string>
|
<string name="settings_status_on">עצור</string>
|
||||||
<string name="settings_status_off_summary">השירות הופסק</string>
|
<string name="settings_status_off_summary">השירות הופסק</string>
|
||||||
<string name="settings_status_on_summary">השירות פועל</string>
|
<string name="settings_status_on_summary">השירות פועל</string>
|
||||||
<string name="settings_provider_title">ספק מיקום</string>
|
<string name="settings_accuracy_title">דיוק מיקום</string>
|
||||||
<string name="settings_provider_summary">ספק מיקום</string>
|
<string name="settings_accuracy_summary">דיוק מיקום מבוקש</string>
|
||||||
<string name="settings_provider_gps">GPS</string>
|
<string name="settings_accuracy_high">מדוייק </string>
|
||||||
<string name="settings_provider_network">רשת</string>
|
<string name="settings_accuracy_medium">בינוני</string>
|
||||||
<string name="settings_provider_mixed">GPS + רשת</string>
|
<string name="settings_accuracy_low">נמוך - משתמש רק בGPS של המכשיר </string>
|
||||||
|
<string name="settings_foreground_title">אפשר הפעלה ברקע</string>
|
||||||
<string name="settings_foreground_summary">הגדל את עדיפות התוכנה</string>
|
<string name="settings_foreground_summary">הגדל את עדיפות התוכנה</string>
|
||||||
<string name="menu_status">סטטוס</string>
|
<string name="menu_status">סטטוס</string>
|
||||||
<string name="menu_about">אודות</string>
|
|
||||||
<string name="menu_shortcuts">הוסף קיצור דרך</string>
|
<string name="menu_shortcuts">הוסף קיצור דרך</string>
|
||||||
<string name="menu_clear">נקה</string>
|
<string name="menu_clear">נקה</string>
|
||||||
<string name="about_description">GPS Tracker בזמן אמת עבור מכשירי אנדרואיד</string>
|
<string name="status_service_create">אפליקציה הופעלה</string>
|
||||||
<string name="about_license">יישום זה הוא קוד פתוח, קוד המקור מורשה תחת רישיון Apache גירסה 2.0 וזמין על GitHub.</string>
|
<string name="status_service_destroy">אפליקציה הופסקה</string>
|
||||||
<string name="about_web">לפרטים נוספים ניתן לפנות לרוגב מחשבים 09-7469155 / www.sherlock.co.il או visit\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">נשלח בהצלחה</string>
|
<string name="status_send_success">נשלח בהצלחה</string>
|
||||||
<string name="status_send_fail">שליחה נכשלה</string>
|
<string name="status_send_fail">שליחה נכשלה</string>
|
||||||
<string name="status_location_update">עדכון מיקום</string>
|
<string name="status_location_update">עדכון מיקום</string>
|
||||||
<string name="status_connectivity_change">שינוי חיבור</string>
|
<string name="status_network_online">רשת באונליין </string>
|
||||||
|
<string name="status_network_offline">רשת מנותקת</string>
|
||||||
<string name="hidden_app_name">הגדרות המכשיר</string>
|
<string name="hidden_app_name">הגדרות המכשיר</string>
|
||||||
|
<string name="hidden_alert">האפליקציה הוסתרה. כדי לפתוח אותה שוב חייג בטלפון 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">הזן כתובת חוקית http:// או https:// URL</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,30 +2,42 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">ट्रैक्कार क्लाइंट </string>
|
<string name="app_name">ट्रैक्कार क्लाइंट </string>
|
||||||
<string name="app_logo">ट्रैक्कार</string>
|
<string name="app_logo">ट्रैक्कार</string>
|
||||||
|
<string name="shortcut_start">प्रारंभ</string>
|
||||||
|
<string name="shortcut_stop">रोक</string>
|
||||||
|
<string name="shortcut_sos">मुसीबत का इशारा</string>
|
||||||
|
<string name="channel_default">डिफ़ॉल्ट</string>
|
||||||
<string name="settings_id_title">उपकरण पहचानकर्ता</string>
|
<string name="settings_id_title">उपकरण पहचानकर्ता</string>
|
||||||
|
<string name="settings_url_title">यूआरएल शीर्षक</string>
|
||||||
|
<string name="settings_url_summary">यूआरएल सारांश</string>
|
||||||
<string name="settings_interval_title">फ्रीक्वेंसी / आवृत्ति</string>
|
<string name="settings_interval_title">फ्रीक्वेंसी / आवृत्ति</string>
|
||||||
|
<string name="settings_interval_summary">अंतराल सारांश</string>
|
||||||
|
<string name="settings_distance_title">दूरी शीर्षक</string>
|
||||||
|
<string name="settings_distance_summary">दूरी सारांश</string>
|
||||||
|
<string name="settings_angle_title">कोण शीर्षक</string>
|
||||||
|
<string name="settings_angle_summary">कोण सारांश</string>
|
||||||
<string name="settings_status_title">सेवा की स्थिति</string>
|
<string name="settings_status_title">सेवा की स्थिति</string>
|
||||||
<string name="settings_status_off">आरम्भ</string>
|
<string name="settings_status_off">आरम्भ</string>
|
||||||
<string name="settings_status_on">रोकें</string>
|
<string name="settings_status_on">रोकें</string>
|
||||||
<string name="settings_status_off_summary">सेवा रुक गई है</string>
|
<string name="settings_status_off_summary">सेवा रुक गई है</string>
|
||||||
<string name="settings_status_on_summary">सेवा चल रही है</string>
|
<string name="settings_status_on_summary">सेवा चल रही है</string>
|
||||||
<string name="settings_provider_title">जगह / स्थान / स्तिथि प्रदाता</string>
|
<string name="settings_accuracy_title">सटीकता शीर्षक</string>
|
||||||
<string name="settings_provider_summary">जगह / स्थान / स्तिथि डेटा का स्रोत</string>
|
<string name="settings_accuracy_summary">सटीकता सारांश</string>
|
||||||
<string name="settings_provider_gps">जीपीएस प्रदाता</string>
|
<string name="settings_accuracy_high">सटीकता उच्च</string>
|
||||||
<string name="settings_provider_network">नेटवर्क प्रदाता</string>
|
<string name="settings_accuracy_medium">सटीकता माध्यम</string>
|
||||||
<string name="settings_provider_mixed">मिश्रित प्रदाता</string>
|
<string name="settings_accuracy_low">सटीकता कम</string>
|
||||||
<string name="settings_foreground_title">अग्रभूमि सेवा</string>
|
<string name="settings_foreground_title">अग्रभूमि शीर्षका</string>
|
||||||
<string name="settings_foreground_summary">सेवा प्राथमिकता बढ़ाएँ</string>
|
<string name="settings_foreground_summary">अग्रभूमि सारांश</string>
|
||||||
<string name="menu_status">स्थिति</string>
|
<string name="menu_status">स्थिति</string>
|
||||||
<string name="menu_about">बारे में</string>
|
|
||||||
<string name="menu_shortcuts">शॉर्टकट्स जोड़ें</string>
|
<string name="menu_shortcuts">शॉर्टकट्स जोड़ें</string>
|
||||||
<string name="menu_clear">स्पष्ट / साफ़</string>
|
<string name="menu_clear">स्पष्ट / साफ़</string>
|
||||||
<string name="about_description">एंड्रॉयड उपकरणों के लिए वास्तविक समय जीपीएस ट्रैकर। ट्रैक्कार सर्वर और अन्य ट्रैकिंग प्रणालियों के साथ अनुकूल।</string>
|
<string name="status_service_create">सेवा बनाएँ</string>
|
||||||
<string name="about_license">इस एप्लिकेशन के पास स्वतंत्र और खुला स्रोत है , स्रोत कोड अपाचे लाइसेंस संस्करण 2.0 और GitHub के अंतर्गत उपलब्ध लाइसेंस प्राप्त है ।</string>
|
<string name="status_service_destroy">सेवा नष्ट</string>
|
||||||
<string name="about_web">अधिक जानकारी के लिए www.traccar.org/client वेबसाइट देखें </string>
|
<string name="status_send_success">सफलता भेजें</string>
|
||||||
<string name="status_send_fail">भेजना विफल हो गया है </string>
|
<string name="status_send_fail">भेजना विफल हो गया है </string>
|
||||||
<string name="status_location_update">जगह / स्थान / स्तिथि का अद्यतन / ताजी जानकारी</string>
|
<string name="status_location_update">जगह / स्थान / स्तिथि का अद्यतन / ताजी जानकारी</string>
|
||||||
<string name="status_connectivity_change">कनेक्टिविटी / संयोजकता परिवर्तन</string>
|
<string name="status_network_online">नेटवर्क ऑनलाइन</string>
|
||||||
|
<string name="status_network_offline">नेटवर्क ऑफ़लाइन</string>
|
||||||
<string name="hidden_app_name">उपकरण की सेटिंग्स</string>
|
<string name="hidden_app_name">उपकरण की सेटिंग्स</string>
|
||||||
<string name="hidden_alert">एप्लिकेशन को छुपा दिया गया है l इसे फिर से खोलने के लिए डायल करें 8722227 ( TRACCAR ) l</string>
|
<string name="hidden_alert">एप्लिकेशन को छुपा दिया गया है l इसे फिर से खोलने के लिए डायल करें 8722227 ( TRACCAR ) l</string>
|
||||||
|
<string name="error_msg_invalid_url">अवैध यूआरएल त्रुटि संदेश</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar klijent</string>
|
<string name="app_name">Traccar klijent</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Pokreni servis</string>
|
||||||
|
<string name="shortcut_stop">Zaustavi servis</string>
|
||||||
|
<string name="shortcut_sos">Pošalji SOS</string>
|
||||||
|
<string name="channel_default">Primarni kanal</string>
|
||||||
<string name="settings_id_title">Identifikator uređaja</string>
|
<string name="settings_id_title">Identifikator uređaja</string>
|
||||||
<string name="settings_url_title">Adresa poslužitelja</string>
|
<string name="settings_url_title">Adresa poslužitelja</string>
|
||||||
<string name="settings_url_summary">Adresa poslužitelja za praćenje</string>
|
<string name="settings_url_summary">Adresa poslužitelja za praćenje</string>
|
||||||
@@ -16,24 +20,29 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Servis zaustavljen</string>
|
<string name="settings_status_off_summary">Servis zaustavljen</string>
|
||||||
<string name="settings_status_on_summary">Servis pokrenut</string>
|
<string name="settings_status_on_summary">Servis pokrenut</string>
|
||||||
<string name="settings_provider_title">Pružatelj usluge lokacija</string>
|
<string name="settings_buffer">Offline memoriranje</string>
|
||||||
<string name="settings_provider_summary">Izvor podataka o lokaciji</string>
|
<string name="settings_buffer_off_summary">Predmemoriranje isključeno</string>
|
||||||
<string name="settings_provider_gps">GPS pružatelj usluge</string>
|
<string name="settings_buffer_on_summary">Predmemoriranje uključeno</string>
|
||||||
<string name="settings_provider_network">Mrežni pružatelj usluge</string>
|
<string name="settings_wakelock">Gašenje ekrana pri neaktivnosti</string>
|
||||||
<string name="settings_provider_mixed">Mješani pružatelj usluge</string>
|
<string name="settings_wakelock_off_summary">Gasi ekran pri neaktivnosti</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Ne gasi ekran pri neaktivnosti</string>
|
||||||
|
<string name="settings_accuracy_title">Točnost lokacije</string>
|
||||||
|
<string name="settings_accuracy_summary">Željena preciznost lokacije</string>
|
||||||
|
<string name="settings_accuracy_high">Visoki</string>
|
||||||
|
<string name="settings_accuracy_medium">Srednji</string>
|
||||||
|
<string name="settings_accuracy_low">Niski</string>
|
||||||
<string name="settings_foreground_title">Predhodna usluga</string>
|
<string name="settings_foreground_title">Predhodna usluga</string>
|
||||||
<string name="settings_foreground_summary">Povećanje prioriteta usluge</string>
|
<string name="settings_foreground_summary">Povećanje prioriteta usluge</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">O nama</string>
|
|
||||||
<string name="menu_shortcuts">Dodaj prečace</string>
|
<string name="menu_shortcuts">Dodaj prečace</string>
|
||||||
<string name="menu_clear">Očisti</string>
|
<string name="menu_clear">Očisti</string>
|
||||||
<string name="about_description">GPS praćenje u stvarnom vremenu za Android uređaje. Kompatibilno sa Traccar Server i drugim sustavima za praćenje.</string>
|
<string name="status_service_create">Servis pokrenut</string>
|
||||||
<string name="about_license">Ova aplikacija je besplatna i iz otvorenog izvora, izvorni kod je zaštićen Apache Licencom verzija 2.0 i dostupna na GitHub.</string>
|
<string name="status_service_destroy">Servis zaustavljen</string>
|
||||||
<string name="about_web">Za više informacija posjetite www.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Slanje uspješno</string>
|
<string name="status_send_success">Slanje uspješno</string>
|
||||||
<string name="status_send_fail">Greška pri slanju</string>
|
<string name="status_send_fail">Greška pri slanju</string>
|
||||||
<string name="status_location_update">Osvežavanje lokacije</string>
|
<string name="status_location_update">Osvežavanje lokacije</string>
|
||||||
<string name="status_connectivity_change">Promjena konekcije</string>
|
<string name="status_network_online">Mrežna dostupnost</string>
|
||||||
|
<string name="status_network_offline">Mrežna nedostupnost</string>
|
||||||
<string name="hidden_app_name">Podešavanje uređaja</string>
|
<string name="hidden_app_name">Podešavanje uređaja</string>
|
||||||
<string name="hidden_alert">Aplikacija je skrivena. Za ponovno otvaranje molim nazovite 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikacija je skrivena. Za ponovno otvaranje molim nazovite 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Molimo unesite ispravnu http:// ili https:// adresu</string>
|
<string name="error_msg_invalid_url">Molimo unesite ispravnu http:// ili https:// adresu</string>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Kliens</string>
|
<string name="app_name">Traccar Kliens</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Szolgáltatás indítása</string>
|
||||||
|
<string name="shortcut_stop">Szolgáltatás leállítása</string>
|
||||||
|
<string name="shortcut_sos">SOS küldése</string>
|
||||||
|
<string name="channel_default">Elsődleges csatorna</string>
|
||||||
<string name="settings_id_title">Eszközazonosító</string>
|
<string name="settings_id_title">Eszközazonosító</string>
|
||||||
<string name="settings_url_title">Szerver URL</string>
|
<string name="settings_url_title">Szerver URL</string>
|
||||||
<string name="settings_url_summary">Nyomkövető szerver URL</string>
|
<string name="settings_url_summary">Nyomkövető szerver URL</string>
|
||||||
@@ -16,25 +20,37 @@
|
|||||||
<string name="settings_status_on">Megállítás</string>
|
<string name="settings_status_on">Megállítás</string>
|
||||||
<string name="settings_status_off_summary">Szolgáltatás megállítva</string>
|
<string name="settings_status_off_summary">Szolgáltatás megállítva</string>
|
||||||
<string name="settings_status_on_summary">Szolgáltatás elindítva</string>
|
<string name="settings_status_on_summary">Szolgáltatás elindítva</string>
|
||||||
<string name="settings_provider_title">Pozíciós szolgáltató</string>
|
<string name="settings_buffer">Offline pufferelés</string>
|
||||||
<string name="settings_provider_summary">Pozíciós adatok forrása</string>
|
<string name="settings_buffer_off_summary">Pufferelés ki</string>
|
||||||
<string name="settings_provider_gps">GPS szolgáltató</string>
|
<string name="settings_buffer_on_summary">Pufferelés be</string>
|
||||||
<string name="settings_provider_network">Hálózati szolgáltató</string>
|
<string name="settings_wakelock">Ébresztési zár</string>
|
||||||
<string name="settings_provider_mixed">Kevert szolgáltató</string>
|
<string name="settings_wakelock_off_summary">Ébresztési zár ki</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Ébresztési zár be</string>
|
||||||
|
<string name="settings_accuracy_title">Pozíció pontossága</string>
|
||||||
|
<string name="settings_accuracy_summary">Kívánt pozíció pontosság</string>
|
||||||
|
<string name="settings_accuracy_high">Magas</string>
|
||||||
|
<string name="settings_accuracy_medium">Közepes</string>
|
||||||
|
<string name="settings_accuracy_low">Alacsony</string>
|
||||||
<string name="settings_foreground_title">Előtér szolgáltatás</string>
|
<string name="settings_foreground_title">Előtér szolgáltatás</string>
|
||||||
<string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string>
|
<string name="settings_foreground_summary">Szolgáltatás prioritásának emelése</string>
|
||||||
<string name="menu_status">Státusz</string>
|
<string name="menu_status">Státusz</string>
|
||||||
<string name="menu_about">Névjegy</string>
|
<string name="menu_info">Infó</string>
|
||||||
<string name="menu_shortcuts">Parancsikon hozzáadása</string>
|
<string name="menu_shortcuts">Parancsikon hozzáadása</string>
|
||||||
<string name="menu_clear">Töröl</string>
|
<string name="menu_clear">Töröl</string>
|
||||||
<string name="about_description">Valós idejű GPS követő Android eszközökre. Kompatibilis többek közt a Traccar Szerverrel és egyéb követő rendszerekkel is.</string>
|
<string name="status_service_create">Szolgáltatás elindítva</string>
|
||||||
<string name="about_license">Ez az applikáció ingyenes és nyílt forrású, forráskódja az Apache License 2.0 licenccel rendelkezik és elérhető a GitHub-on.</string>
|
<string name="status_service_destroy">Szolgáltatás leállítva</string>
|
||||||
<string name="about_web">További információkért látogass el az alábbi weboldalra\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Küldés sikeres</string>
|
<string name="status_send_success">Küldés sikeres</string>
|
||||||
<string name="status_send_fail">Küldés sikertelen</string>
|
<string name="status_send_fail">Küldés sikertelen</string>
|
||||||
<string name="status_location_update">Pozíció frissítés</string>
|
<string name="status_location_update">Pozíció frissítés</string>
|
||||||
<string name="status_connectivity_change">Kapcsolódás módosítása</string>
|
<string name="status_network_online">Hálózat aktív</string>
|
||||||
|
<string name="status_network_offline">Hálózat nem aktív</string>
|
||||||
<string name="hidden_app_name">Eszköz beállítások</string>
|
<string name="hidden_app_name">Eszköz beállítások</string>
|
||||||
<string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string>
|
<string name="hidden_alert">Ez az applikáció el lett rejtve. Megnyitásához kérjük hívja a 8722227 (TRACCAR) telefonszámot.</string>
|
||||||
<string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string>
|
<string name="error_msg_invalid_url">Adjon meg egy érvényes URL-t (http:// vagy https://)</string>
|
||||||
|
<string name="request_exception">A folyamatos helyadatok
|
||||||
|
gyűjtéséhez kapcsolja ki
|
||||||
|
az alkalmazás akkumulátor
|
||||||
|
optimazilását.</string>
|
||||||
|
<string name="request_background">A folyamatos helyadat gyűjtéshez engedélyezze a \"%s\" jogosultságot.</string>
|
||||||
|
<string name="request_background_option">Mindig engedélyezve</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Mulai Layanan</string>
|
||||||
|
<string name="shortcut_stop">Tutup Layanan</string>
|
||||||
|
<string name="shortcut_sos">Kirim SOS</string>
|
||||||
|
<string name="channel_default">Jalur Utama</string>
|
||||||
<string name="settings_id_title">Pengindentifikasi Perangkat</string>
|
<string name="settings_id_title">Pengindentifikasi Perangkat</string>
|
||||||
<string name="settings_url_title">URL Server</string>
|
<string name="settings_url_title">URL Server</string>
|
||||||
<string name="settings_url_summary">URL Server Pelacak</string>
|
<string name="settings_url_summary">URL Server Pelacak</string>
|
||||||
@@ -16,24 +20,23 @@
|
|||||||
<string name="settings_status_on">Berhenti</string>
|
<string name="settings_status_on">Berhenti</string>
|
||||||
<string name="settings_status_off_summary">Service Berhenti</string>
|
<string name="settings_status_off_summary">Service Berhenti</string>
|
||||||
<string name="settings_status_on_summary">Service Aktif</string>
|
<string name="settings_status_on_summary">Service Aktif</string>
|
||||||
<string name="settings_provider_title">Lokasi Penyedia Layanan</string>
|
<string name="settings_accuracy_title">Ketepatan Lokasi</string>
|
||||||
<string name="settings_provider_summary">Sumber Lokasi Data</string>
|
<string name="settings_accuracy_summary">Ketepatan Lokasi Yg Dinginkan</string>
|
||||||
<string name="settings_provider_gps">Penyedia Layanan GPS</string>
|
<string name="settings_accuracy_high">Tinggi</string>
|
||||||
<string name="settings_provider_network">Penyedia Layanan Jaringan</string>
|
<string name="settings_accuracy_medium">Tengah</string>
|
||||||
<string name="settings_provider_mixed">Campuran Penyedia Layanan</string>
|
<string name="settings_accuracy_low">Rendah</string>
|
||||||
<string name="settings_foreground_title">Service Depan</string>
|
<string name="settings_foreground_title">Service Depan</string>
|
||||||
<string name="settings_foreground_summary">TIngkatkan Prioritas Service</string>
|
<string name="settings_foreground_summary">TIngkatkan Prioritas Service</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Tentang</string>
|
|
||||||
<string name="menu_shortcuts">Tambah Jalan Pintas</string>
|
<string name="menu_shortcuts">Tambah Jalan Pintas</string>
|
||||||
<string name="menu_clear">Bersihkan</string>
|
<string name="menu_clear">Bersihkan</string>
|
||||||
<string name="about_description">Aplikasi GPS Untuk Perangkat Android. Kompatibel Dengan Traccar Server Dan Sistem GPS Lainnya.</string>
|
<string name="status_service_create">Layanan Dimulai</string>
|
||||||
<string name="about_license">Aplikasi Ini Gratis Dan Terbuka, Sumber Kode Berlisensi Dibawah Apache License 2.0 Dan Tersedia di GitHub.</string>
|
<string name="status_service_destroy">Layanan Berhenti</string>
|
||||||
<string name="about_web">Untuk Informasi Lebih Lanjut Kunjungi www.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Sukses Terkirim</string>
|
<string name="status_send_success">Sukses Terkirim</string>
|
||||||
<string name="status_send_fail">Gagal Terkirim</string>
|
<string name="status_send_fail">Gagal Terkirim</string>
|
||||||
<string name="status_location_update">Lokasi Terbaru</string>
|
<string name="status_location_update">Lokasi Terbaru</string>
|
||||||
<string name="status_connectivity_change">Koneksi Berubah</string>
|
<string name="status_network_online">Jaringan Hidup</string>
|
||||||
|
<string name="status_network_offline">Jaringan Mati</string>
|
||||||
<string name="hidden_app_name">Pengaturan Perangkat</string>
|
<string name="hidden_app_name">Pengaturan Perangkat</string>
|
||||||
<string name="hidden_alert">Aplikasi Telah Tersembunyi. Untuk Membuka Lagi Silahkan Tekan 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikasi Telah Tersembunyi. Untuk Membuka Lagi Silahkan Tekan 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Tolong Masukan http:// atau https:// URL Yang Benar</string>
|
<string name="error_msg_invalid_url">Tolong Masukan http:// atau https:// URL Yang Benar</string>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Avvia servizio</string>
|
||||||
|
<string name="shortcut_stop">Ferma servizio</string>
|
||||||
|
<string name="shortcut_sos">Invia SOS</string>
|
||||||
|
<string name="channel_default">Canale primario</string>
|
||||||
<string name="settings_id_title">Identificativo dispositivo</string>
|
<string name="settings_id_title">Identificativo dispositivo</string>
|
||||||
<string name="settings_url_title">Server URL</string>
|
<string name="settings_url_title">Server URL</string>
|
||||||
<string name="settings_url_summary">Tracking server URL</string>
|
<string name="settings_url_summary">Tracking server URL</string>
|
||||||
@@ -16,25 +20,34 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Servizio arrestato</string>
|
<string name="settings_status_off_summary">Servizio arrestato</string>
|
||||||
<string name="settings_status_on_summary">Servizio avviato</string>
|
<string name="settings_status_on_summary">Servizio avviato</string>
|
||||||
<string name="settings_provider_title">Provider posizione</string>
|
<string name="settings_buffer">Buffering offline</string>
|
||||||
<string name="settings_provider_summary">Fonte dei dati di localizzazione</string>
|
<string name="settings_buffer_off_summary">Buffering spento</string>
|
||||||
<string name="settings_provider_gps">Provider GPS</string>
|
<string name="settings_buffer_on_summary">Buffering acceso</string>
|
||||||
<string name="settings_provider_network">Provider di rete</string>
|
<string name="settings_wakelock">Wake lock</string>
|
||||||
<string name="settings_provider_mixed">Provider misto</string>
|
<string name="settings_wakelock_off_summary">Wake lock spento</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Wake lock acceso</string>
|
||||||
|
<string name="settings_accuracy_title">Accuratezza posizione</string>
|
||||||
|
<string name="settings_accuracy_summary">Precisione desiderata per la posizione</string>
|
||||||
|
<string name="settings_accuracy_high">Alta</string>
|
||||||
|
<string name="settings_accuracy_medium">Media</string>
|
||||||
|
<string name="settings_accuracy_low">Bassa</string>
|
||||||
<string name="settings_foreground_title">Servizio in primo piano</string>
|
<string name="settings_foreground_title">Servizio in primo piano</string>
|
||||||
<string name="settings_foreground_summary">Aumenta la priorità del servizio</string>
|
<string name="settings_foreground_summary">Aumenta la priorità del servizio</string>
|
||||||
<string name="menu_status">Stato</string>
|
<string name="menu_status">Stato</string>
|
||||||
<string name="menu_about">Informazioni</string>
|
<string name="menu_info">Informazioni</string>
|
||||||
<string name="menu_shortcuts">Aggiungi combinazione rapida</string>
|
<string name="menu_shortcuts">Aggiungi combinazione rapida</string>
|
||||||
<string name="menu_clear">Pulisci</string>
|
<string name="menu_clear">Pulisci</string>
|
||||||
<string name="about_description">Real time GPS tracker per dispositivi Android. Compatibile con Traccar Server e altri sistemi di tracking.</string>
|
<string name="status_service_create">Servizio avviato</string>
|
||||||
<string name="about_license">Questa applicazione è libera e open source, il codice sorgente è sotto licenza Apache License Version 2.0 e disponibile su GitHub.</string>
|
<string name="status_service_destroy">Servizio fermato</string>
|
||||||
<string name="about_web">Per maggiori informazioni visitate \nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Invio riuscito</string>
|
<string name="status_send_success">Invio riuscito</string>
|
||||||
<string name="status_send_fail">Invio fallito</string>
|
<string name="status_send_fail">Invio fallito</string>
|
||||||
<string name="status_location_update">Aggiornamento posizione</string>
|
<string name="status_location_update">Aggiornamento posizione</string>
|
||||||
<string name="status_connectivity_change">Connessione cambiata</string>
|
<string name="status_network_online">Network online</string>
|
||||||
|
<string name="status_network_offline">Network offline</string>
|
||||||
<string name="hidden_app_name">Impostazioni dispositivo</string>
|
<string name="hidden_app_name">Impostazioni dispositivo</string>
|
||||||
<string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">La app è stata nascosta. Per aprirla nuovamente digita 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string>
|
<string name="error_msg_invalid_url">Per favore inserisci un URL valido http:// o https://</string>
|
||||||
|
<string name="request_exception">Per abilitare la raccolta continua delle posizioni, disabilita le ottimizzazioni batteria per questa applicazione</string>
|
||||||
|
<string name="request_background">Per abilitare la raccolta delle posizione, abilita il permesso \"%s\"</string>
|
||||||
|
<string name="request_background_option">Contenti per tutto il tempo</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name"> Traccar לאנדרויד</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">הפעל שירות </string>
|
||||||
|
<string name="shortcut_stop">עצור תהליך</string>
|
||||||
|
<string name="shortcut_sos">שלח הודעת חירום</string>
|
||||||
|
<string name="channel_default">ערוץ ראשי</string>
|
||||||
|
<string name="settings_id_title">מזהה מכשיר</string>
|
||||||
|
<string name="settings_url_title">כתובת שרת</string>
|
||||||
|
<string name="settings_url_summary">כתובת שרת איתור</string>
|
||||||
|
<string name="settings_interval_title">תדירות</string>
|
||||||
|
<string name="settings_interval_summary">זמן דיווח בשניות </string>
|
||||||
|
<string name="settings_distance_title">מרחק</string>
|
||||||
|
<string name="settings_distance_summary">דיווח מרחק במטרים</string>
|
||||||
|
<string name="settings_angle_title">זווית</string>
|
||||||
|
<string name="settings_angle_summary">דיווח פניות בזווית </string>
|
||||||
|
<string name="settings_status_title">מצב שירות</string>
|
||||||
|
<string name="settings_status_off">הפעל</string>
|
||||||
|
<string name="settings_status_on">עצור</string>
|
||||||
|
<string name="settings_status_off_summary">השירות הופסק</string>
|
||||||
|
<string name="settings_status_on_summary">השירות פועל</string>
|
||||||
|
<string name="settings_accuracy_title">דיוק מיקום</string>
|
||||||
|
<string name="settings_accuracy_summary">דיוק מיקום מבוקש</string>
|
||||||
|
<string name="settings_accuracy_high">מדוייק </string>
|
||||||
|
<string name="settings_accuracy_medium">בינוני</string>
|
||||||
|
<string name="settings_accuracy_low">נמוך - משתמש רק בGPS של המכשיר </string>
|
||||||
|
<string name="settings_foreground_title">אפשר הפעלה ברקע</string>
|
||||||
|
<string name="settings_foreground_summary">הגדל את עדיפות התוכנה</string>
|
||||||
|
<string name="menu_status">סטטוס</string>
|
||||||
|
<string name="menu_shortcuts">הוסף קיצור דרך</string>
|
||||||
|
<string name="menu_clear">נקה</string>
|
||||||
|
<string name="status_service_create">אפליקציה הופעלה</string>
|
||||||
|
<string name="status_service_destroy">אפליקציה הופסקה</string>
|
||||||
|
<string name="status_send_success">נשלח בהצלחה</string>
|
||||||
|
<string name="status_send_fail">שליחה נכשלה</string>
|
||||||
|
<string name="status_location_update">עדכון מיקום</string>
|
||||||
|
<string name="status_network_online">רשת באונליין </string>
|
||||||
|
<string name="status_network_offline">רשת מנותקת</string>
|
||||||
|
<string name="hidden_app_name">הגדרות המכשיר</string>
|
||||||
|
<string name="hidden_alert">האפליקציה הוסתרה. כדי לפתוח אותה שוב חייג בטלפון 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">הזן כתובת חוקית http:// או https:// URL</string>
|
||||||
|
</resources>
|
||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar クライアント</string>
|
<string name="app_name">Traccar クライアント</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">サービスを開始</string>
|
||||||
|
<string name="shortcut_stop">サービスを停止</string>
|
||||||
|
<string name="shortcut_sos">SOSを送信</string>
|
||||||
|
<string name="channel_default">プライマリーチャンネル</string>
|
||||||
<string name="settings_id_title">デバイス ID</string>
|
<string name="settings_id_title">デバイス ID</string>
|
||||||
<string name="settings_url_title">サーバー URL</string>
|
<string name="settings_url_title">サーバー URL</string>
|
||||||
<string name="settings_url_summary">トラッキングサーバーの URL</string>
|
<string name="settings_url_summary">トラッキングサーバーの URL</string>
|
||||||
@@ -14,27 +18,29 @@
|
|||||||
<string name="settings_status_title">サービスステータス</string>
|
<string name="settings_status_title">サービスステータス</string>
|
||||||
<string name="settings_status_off">開始</string>
|
<string name="settings_status_off">開始</string>
|
||||||
<string name="settings_status_on">停止</string>
|
<string name="settings_status_on">停止</string>
|
||||||
<string name="settings_status_off_summary">サービスは停止しました</string>
|
<string name="settings_status_off_summary">サービス停止中</string>
|
||||||
<string name="settings_status_on_summary">サービスは実行中</string>
|
<string name="settings_status_on_summary">サービス実行中</string>
|
||||||
<string name="settings_provider_title">位置プロバイダー</string>
|
<string name="settings_buffer">オフラインバッファリング</string>
|
||||||
<string name="settings_provider_summary">位置データのソース</string>
|
<string name="settings_buffer_off_summary">バッファリング オフ</string>
|
||||||
<string name="settings_provider_gps">GPS プロバイダー</string>
|
<string name="settings_buffer_on_summary">バッファリング オン</string>
|
||||||
<string name="settings_provider_network">ネットワークプロバイダー</string>
|
<string name="settings_accuracy_title">位置情報の精度</string>
|
||||||
<string name="settings_provider_mixed">混合プロバイダー</string>
|
<string name="settings_accuracy_summary">要求される位置情報の精度</string>
|
||||||
|
<string name="settings_accuracy_high">高</string>
|
||||||
|
<string name="settings_accuracy_medium">中</string>
|
||||||
|
<string name="settings_accuracy_low">低</string>
|
||||||
<string name="settings_foreground_title">フォアグラウンドサービス</string>
|
<string name="settings_foreground_title">フォアグラウンドサービス</string>
|
||||||
<string name="settings_foreground_summary">サービス優先度を上げる</string>
|
<string name="settings_foreground_summary">サービス優先度を上げる</string>
|
||||||
<string name="menu_status">ステータス</string>
|
<string name="menu_status">ステータス</string>
|
||||||
<string name="menu_about">アプリについて</string>
|
|
||||||
<string name="menu_shortcuts">ショートカットを追加</string>
|
<string name="menu_shortcuts">ショートカットを追加</string>
|
||||||
<string name="menu_clear">クリア</string>
|
<string name="menu_clear">クリア</string>
|
||||||
<string name="about_description">Android デバイス用のリアルタイム GPS トラッカー。 Traccar サーバーや他のトラッキングシステムと互換性があります。</string>
|
<string name="status_service_create">サービスを開始しました</string>
|
||||||
<string name="about_license">このアプリケーションは無料のオープンソースで、ソースコードは Apache ライセンス バージョン 2.0 でライセンスされます。 GitHub で利用可能です。</string>
|
<string name="status_service_destroy">サービスを停止しました</string>
|
||||||
<string name="about_web">詳細は visit\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">送信に成功しました</string>
|
<string name="status_send_success">送信に成功しました</string>
|
||||||
<string name="status_send_fail">送信に失敗しました</string>
|
<string name="status_send_fail">送信に失敗しました</string>
|
||||||
<string name="status_location_update">位置の更新</string>
|
<string name="status_location_update">位置情報更新</string>
|
||||||
<string name="status_connectivity_change">接続の変更</string>
|
<string name="status_network_online">ネットワーク オンライン</string>
|
||||||
|
<string name="status_network_offline">ネットワーク オフライン</string>
|
||||||
<string name="hidden_app_name">デバイス設定</string>
|
<string name="hidden_app_name">デバイス設定</string>
|
||||||
<string name="hidden_alert">アプリは非表示になりました。 もう一度開くには 8722227 (TRACCAR) にダイヤルしてください。</string>
|
<string name="hidden_alert">アプリは非表示になりました。 もう一度開くには 8722227 (TRACCAR) にダイヤルしてください。</string>
|
||||||
<string name="error_msg_invalid_url">正しい http:// または https:// URL を入力してください</string>
|
<string name="error_msg_invalid_url">http:// または https:// から始まるURL を正しく入力してください。</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">Traccar კლიენტი</string>
|
||||||
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">სერვისის სტარტი</string>
|
||||||
|
<string name="shortcut_stop">სერვისის დასტოპება</string>
|
||||||
|
<string name="shortcut_sos">SOS სიგნალის გაგზავნა</string>
|
||||||
|
<string name="channel_default">ძირითადი არხი</string>
|
||||||
|
<string name="settings_id_title">მოწყობილობის იდენტიფიკატორი</string>
|
||||||
|
<string name="settings_url_title">სერვერის მისამართი URL</string>
|
||||||
|
<string name="settings_url_summary">ტრეკინგ სერვერის მისამართი URL</string>
|
||||||
|
<string name="settings_interval_title">სიხშირე</string>
|
||||||
|
<string name="settings_interval_summary">რეპორტებს შორის ინტერვალი წამებში</string>
|
||||||
|
<string name="settings_distance_title">დისტანცია</string>
|
||||||
|
<string name="settings_distance_summary">რეპორტებს შორის ინტერვალი მეტრებში</string>
|
||||||
|
<string name="settings_angle_title">მიმართულება</string>
|
||||||
|
<string name="settings_angle_summary">მიმართულების რეპორტი გრადუსებში</string>
|
||||||
|
<string name="settings_status_title">სერვისი სტატუსი</string>
|
||||||
|
<string name="settings_status_off">სტარტი</string>
|
||||||
|
<string name="settings_status_on">შეჩერება</string>
|
||||||
|
<string name="settings_status_off_summary">სერვისი შეჩერებულია</string>
|
||||||
|
<string name="settings_status_on_summary">სერვისი გაშვებულია</string>
|
||||||
|
<string name="settings_buffer">ოფლაინ ბუფერიზაცია</string>
|
||||||
|
<string name="settings_buffer_off_summary">ბუფერიზაცია გამორთულია</string>
|
||||||
|
<string name="settings_buffer_on_summary">ბუფერიზაცია ჩართულია</string>
|
||||||
|
<string name="settings_wakelock">გაღვიძების ბლოკირება</string>
|
||||||
|
<string name="settings_wakelock_off_summary">გაღვიძების ბლოკირება გამორთულია</string>
|
||||||
|
<string name="settings_wakelock_on_summary">გაღვიძების ბლოკირება ჩართულია</string>
|
||||||
|
<string name="settings_accuracy_title">მდებარეობის სიზუსტე</string>
|
||||||
|
<string name="settings_accuracy_summary">მდებარეობის სასურველი სიზუსტე</string>
|
||||||
|
<string name="settings_accuracy_high">მაღალი</string>
|
||||||
|
<string name="settings_accuracy_medium">საშუალო</string>
|
||||||
|
<string name="settings_accuracy_low">დაბალი</string>
|
||||||
|
<string name="settings_foreground_title">ფონური სერვისი</string>
|
||||||
|
<string name="settings_foreground_summary">სერვისის პრიორიტეტის გაზრდა</string>
|
||||||
|
<string name="menu_status">სტატუსი</string>
|
||||||
|
<string name="menu_shortcuts">შორტკატის დამატება</string>
|
||||||
|
<string name="menu_clear">გასუფთავება</string>
|
||||||
|
<string name="status_service_create">სერვისი გაშვებულია</string>
|
||||||
|
<string name="status_service_destroy">სერვისი შეჩერებულია</string>
|
||||||
|
<string name="status_send_success">წარმატებით გაიგზავნა</string>
|
||||||
|
<string name="status_send_fail">გაგზავნა ვერ მოხერხდა</string>
|
||||||
|
<string name="status_location_update">მდებარეობა განახლდა</string>
|
||||||
|
<string name="status_network_online">ქსელი კავშირშია</string>
|
||||||
|
<string name="status_network_offline">ქსელი გამორთულია</string>
|
||||||
|
<string name="hidden_app_name">მოწყობილობის პარამეტრები</string>
|
||||||
|
<string name="hidden_alert">პროგრამა დამალულია. მის გასახსნელად გთხოვთ აკრიფოთ 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">გთხოვთ, შეიყვანოთ სწორი http: // ან https: // URL</string>
|
||||||
|
</resources>
|
||||||
@@ -9,24 +9,14 @@
|
|||||||
<string name="settings_status_on">បញ្ឈប់</string>
|
<string name="settings_status_on">បញ្ឈប់</string>
|
||||||
<string name="settings_status_off_summary">សេវាឈប់</string>
|
<string name="settings_status_off_summary">សេវាឈប់</string>
|
||||||
<string name="settings_status_on_summary">កំពុងរត់សេវា</string>
|
<string name="settings_status_on_summary">កំពុងរត់សេវា</string>
|
||||||
<string name="settings_provider_title">ក្រុមហ៊ុនផ្ដល់ទីតាំង</string>
|
|
||||||
<string name="settings_provider_summary">ប្រភពនៃទិន្នន័យទីតាំង</string>
|
|
||||||
<string name="settings_provider_gps">អ្នកផ្តល់សេវាប្រព័ន្ធ GPS</string>
|
|
||||||
<string name="settings_provider_network">អ្នកផ្តល់សេវាបណ្តាញ</string>
|
|
||||||
<string name="settings_provider_mixed">ក្រុមហ៊ុនផ្ដល់សេវាជាមួយគ្នា</string>
|
|
||||||
<string name="settings_foreground_title">សេវាផ្ទៃខាងមុខ</string>
|
<string name="settings_foreground_title">សេវាផ្ទៃខាងមុខ</string>
|
||||||
<string name="settings_foreground_summary">បង្កើនអាទិភាពសេវា</string>
|
<string name="settings_foreground_summary">បង្កើនអាទិភាពសេវា</string>
|
||||||
<string name="menu_status">ស្ថានភាព</string>
|
<string name="menu_status">ស្ថានភាព</string>
|
||||||
<string name="menu_about">អំពី</string>
|
|
||||||
<string name="menu_shortcuts">បន្ថែមផ្លូវកាត់</string>
|
<string name="menu_shortcuts">បន្ថែមផ្លូវកាត់</string>
|
||||||
<string name="menu_clear">ដើម្បីជម្រះ</string>
|
<string name="menu_clear">ដើម្បីជម្រះ</string>
|
||||||
<string name="about_description">កម្មវិធីតាមដាន GPS ពេលវេលាពិតប្រាកដសម្រាប់ឧបករណ៍ប្រព័ន្ធប្រតិបត្តិការ Android ។ ឆបគ្នាជាមួយនឹងម៉ាស៊ីនបម្រើនិងប្រព័ន្ធតាមដានតាមដានផ្សេងទៀត</string>
|
|
||||||
<string name="about_license">កម្មវិធីនេះត្រូវបានបើកចំហនិងឥតគិតថ្លៃ, កូដប្រភពត្រូវបានទទួលបានអាជ្ញាប័ណ្ណក្រោមអាជ្ញាប័ណ្ណ Apache កំណែ 2.0 និងអាចប្រើបាននៅលើ GitHub ។</string>
|
|
||||||
<string name="about_web">ចំពោះព័ត៌មានបន្ថែម\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">ផ្ញើដោយជោគជ័យ</string>
|
<string name="status_send_success">ផ្ញើដោយជោគជ័យ</string>
|
||||||
<string name="status_send_fail">ការផ្ញើបានបរាជ័យ</string>
|
<string name="status_send_fail">ការផ្ញើបានបរាជ័យ</string>
|
||||||
<string name="status_location_update">ធ្វើឱ្យទាន់សម័យទីតាំង</string>
|
<string name="status_location_update">ធ្វើឱ្យទាន់សម័យទីតាំង</string>
|
||||||
<string name="status_connectivity_change">ការផ្លាស់ប្តូរការតភ្ជាប់</string>
|
|
||||||
<string name="hidden_app_name">ការកំណត់ឧបករណ៍</string>
|
<string name="hidden_app_name">ការកំណត់ឧបករណ៍</string>
|
||||||
<string name="hidden_alert">កម្មវិធីនេះត្រូវបានលាក់។ ដើម្បីបើកវាម្តងទៀតសូមចុច 8722227 (TRACCAR) ។</string>
|
<string name="hidden_alert">កម្មវិធីនេះត្រូវបានលាក់។ ដើម្បីបើកវាម្តងទៀតសូមចុច 8722227 (TRACCAR) ។</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,32 +1,43 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar 고객</string>
|
<string name="app_name">Traccar 클라이언트</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">서비스 시작</string>
|
||||||
|
<string name="shortcut_stop">서비스 중지</string>
|
||||||
|
<string name="shortcut_sos">SOS 신호 보내기</string>
|
||||||
|
<string name="channel_default">기본 채널</string>
|
||||||
<string name="settings_id_title">장치 식별자</string>
|
<string name="settings_id_title">장치 식별자</string>
|
||||||
|
<string name="settings_url_title">서버 URL</string>
|
||||||
|
<string name="settings_url_summary">위치 수집 서버 URL</string>
|
||||||
<string name="settings_interval_title">주기</string>
|
<string name="settings_interval_title">주기</string>
|
||||||
|
<string name="settings_interval_summary">위치 수집 주기 (초)</string>
|
||||||
|
<string name="settings_distance_title">거리</string>
|
||||||
|
<string name="settings_distance_summary">최소 위치 수집 기준 거리 (m)</string>
|
||||||
|
<string name="settings_angle_title">각도</string>
|
||||||
|
<string name="settings_angle_summary">최소 위치 수집 기준 회전 각도</string>
|
||||||
<string name="settings_status_title">서비스상태</string>
|
<string name="settings_status_title">서비스상태</string>
|
||||||
<string name="settings_status_off">시작</string>
|
<string name="settings_status_off">시작</string>
|
||||||
<string name="settings_status_on">중지</string>
|
<string name="settings_status_on">중지</string>
|
||||||
<string name="settings_status_off_summary">서비스중지</string>
|
<string name="settings_status_off_summary">서비스중지</string>
|
||||||
<string name="settings_status_on_summary">서비스실행</string>
|
<string name="settings_status_on_summary">서비스실행</string>
|
||||||
<string name="settings_provider_title">위치공급자</string>
|
<string name="settings_accuracy_title">위치 정확도</string>
|
||||||
<string name="settings_provider_summary">위치데이타 출처</string>
|
<string name="settings_accuracy_summary">위치 수신 정확도</string>
|
||||||
<string name="settings_provider_gps">GPS공급자</string>
|
<string name="settings_accuracy_high">높음</string>
|
||||||
<string name="settings_provider_network">네트워크공급자</string>
|
<string name="settings_accuracy_medium">중간</string>
|
||||||
<string name="settings_provider_mixed">혼합공급자</string>
|
<string name="settings_accuracy_low">낮음</string>
|
||||||
<string name="settings_foreground_title">선처리 서비스</string>
|
<string name="settings_foreground_title">선처리 서비스</string>
|
||||||
<string name="settings_foreground_summary">서비스우선순위증가</string>
|
<string name="settings_foreground_summary">서비스우선순위증가</string>
|
||||||
<string name="menu_status">상태</string>
|
<string name="menu_status">상태</string>
|
||||||
<string name="menu_about">관하여</string>
|
|
||||||
<string name="menu_shortcuts">바로가기 추가</string>
|
<string name="menu_shortcuts">바로가기 추가</string>
|
||||||
<string name="menu_clear">초기화</string>
|
<string name="menu_clear">지우기</string>
|
||||||
<string name="about_description">안드로이드 장치를위한 실시간 GPS 추적기. Traccar 서버 및 기타 추적 시스템과 호환됩니다.</string>
|
<string name="status_service_create">서비스 시작됨</string>
|
||||||
<string name="about_license">이 응용 프로그램은 무료이며 오픈 소스이며, 소스 코드는 Apache License Version 2.0에서 사용이 허가되며 GitHub에서 사용할 수 있습니다.</string>
|
<string name="status_service_destroy">서비스 중지됨</string>
|
||||||
<string name="about_web">더 자세한 정보는 \www.traccar.org/client 를 방문하십시오.</string>
|
<string name="status_send_success">위치 송신 성공</string>
|
||||||
<string name="status_send_success">보내기 성공</string>
|
<string name="status_send_fail">위치 송신 실패</string>
|
||||||
<string name="status_send_fail">보내기 실패</string>
|
<string name="status_location_update">위치 업데이트됨</string>
|
||||||
<string name="status_location_update">위치 수정</string>
|
<string name="status_network_online">네트워크 연결됨</string>
|
||||||
<string name="status_connectivity_change">연결 변경</string>
|
<string name="status_network_offline">네트워크 연결 불가</string>
|
||||||
<string name="hidden_app_name">장치설정</string>
|
<string name="hidden_app_name">장치설정</string>
|
||||||
<string name="hidden_alert">앱이 숨겨져 있습니다. 다시 열려면 8722227 (TRACCAR)로 전화하십시오.</string>
|
<string name="hidden_alert">앱이 숨겨져 있습니다. 다시 열려면 8722227 (TRACCAR)로 전화하십시오.</string>
|
||||||
|
<string name="error_msg_invalid_url">올바른 http:// 또는 https:// 형태의 URL 주소를 넣어주세요</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -9,23 +9,13 @@
|
|||||||
<string name="settings_status_on">ຢຸດໃຊ້ງານ</string>
|
<string name="settings_status_on">ຢຸດໃຊ້ງານ</string>
|
||||||
<string name="settings_status_off_summary">ການໃຊ້ງານໄດ້ຢຸດລົງ</string>
|
<string name="settings_status_off_summary">ການໃຊ້ງານໄດ້ຢຸດລົງ</string>
|
||||||
<string name="settings_status_on_summary">ການໃຊ້ງານກຳລັງທຳງານຢູ່</string>
|
<string name="settings_status_on_summary">ການໃຊ້ງານກຳລັງທຳງານຢູ່</string>
|
||||||
<string name="settings_provider_title">ຜູ້ໃຫ້ບໍລິການຈຸດພິກັດ</string>
|
|
||||||
<string name="settings_provider_summary">ແຫລ່ງຂອງຂໍ້ມູນພິກັດ</string>
|
|
||||||
<string name="settings_provider_gps">ຜູ້ໃຫ້ບໍລິການ GPS</string>
|
|
||||||
<string name="settings_provider_network">ຜູ້ໃຫ້ບໍລິການເຄື່ອຄ່າຍ</string>
|
|
||||||
<string name="settings_provider_mixed">ຜູ້ໃຫ້ບໍລິການແບບຮ່ວມກັນ</string>
|
|
||||||
<string name="settings_foreground_title">ເຊີວິດໂຟກຣາວດ໌</string>
|
<string name="settings_foreground_title">ເຊີວິດໂຟກຣາວດ໌</string>
|
||||||
<string name="settings_foreground_summary">ເພີ່ມເຊີວິດໄພອໍຣິດຕີ້</string>
|
<string name="settings_foreground_summary">ເພີ່ມເຊີວິດໄພອໍຣິດຕີ້</string>
|
||||||
<string name="menu_status">ສະຖານະ</string>
|
<string name="menu_status">ສະຖານະ</string>
|
||||||
<string name="menu_about">ກ່ຽວກັບ</string>
|
|
||||||
<string name="menu_shortcuts">ເພີ່ມຊອດຄັດ</string>
|
<string name="menu_shortcuts">ເພີ່ມຊອດຄັດ</string>
|
||||||
<string name="menu_clear">ລົບລ້າງ</string>
|
<string name="menu_clear">ລົບລ້າງ</string>
|
||||||
<string name="about_description">ລາວຈີພີເອສຄາຣ໌ສຳລັບແອນດຣອຍ. ສາມາດໃຊ້ໄດ້ກັບລາວຈີພີເອສຄາຣ໌ເຊີເວີ້.</string>
|
|
||||||
<string name="about_license">ແອັບໂຕນີ້ສາມາດດາວໂຫລດໃຊ້ໄດ້ຟຣີໂດຍບໍ່ມີຄ່າໃຊ້ຈ່າຍຫຍັງ.</string>
|
|
||||||
<string name="about_web">ຂໍ້ມູນເພີ່ມເຕີມໄດ້ທີ່\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_fail">ມີຂໍ້ຜິດພາດໃນການສົ່ງຂໍ້ມູນ</string>
|
<string name="status_send_fail">ມີຂໍ້ຜິດພາດໃນການສົ່ງຂໍ້ມູນ</string>
|
||||||
<string name="status_location_update">ສະຖານທີ່ພິກັດໄດ້ອັບເດດ</string>
|
<string name="status_location_update">ສະຖານທີ່ພິກັດໄດ້ອັບເດດ</string>
|
||||||
<string name="status_connectivity_change">ການເຊື່ອມຕໍ່ມີການປ່ຽນແປງ</string>
|
|
||||||
<string name="hidden_app_name">ການຕັ້ງຄ່າອຸປະກອນ</string>
|
<string name="hidden_app_name">ການຕັ້ງຄ່າອຸປະກອນ</string>
|
||||||
<string name="hidden_alert">ແອັບໂຕນີ້ໄດ້ຖືກເຊື່ອງໄວ້. ຖ້າຢາກເປີດຂຶ້ນມາອີກຄັ້ງກະລຸນາກົດໝາຍເລກ 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">ແອັບໂຕນີ້ໄດ້ຖືກເຊື່ອງໄວ້. ຖ້າຢາກເປີດຂຶ້ນມາອີກຄັ້ງກະລຸນາກົດໝາຍເລກ 8722227 (TRACCAR).</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,30 +2,42 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar programėlė</string>
|
<string name="app_name">Traccar programėlė</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Įjungti servisą</string>
|
||||||
|
<string name="shortcut_stop">Sustabdyti servisą</string>
|
||||||
|
<string name="shortcut_sos">Siųsti SOS</string>
|
||||||
|
<string name="channel_default">Pirminis kanalas</string>
|
||||||
<string name="settings_id_title">Įrenginio numeris</string>
|
<string name="settings_id_title">Įrenginio numeris</string>
|
||||||
|
<string name="settings_url_title">Serverio URL</string>
|
||||||
|
<string name="settings_url_summary">Sekimo serverio URL</string>
|
||||||
<string name="settings_interval_title">Dažnumas</string>
|
<string name="settings_interval_title">Dažnumas</string>
|
||||||
|
<string name="settings_interval_summary">Atnaujinimo intervalas sekundėmis</string>
|
||||||
|
<string name="settings_distance_title">Atstumas</string>
|
||||||
|
<string name="settings_distance_summary">Atnaujinimo atstumas metrais</string>
|
||||||
|
<string name="settings_angle_title">Kampas</string>
|
||||||
|
<string name="settings_angle_summary">Atnaujinimo kampas laipsniais</string>
|
||||||
<string name="settings_status_title">Tarnybos būklė</string>
|
<string name="settings_status_title">Tarnybos būklė</string>
|
||||||
<string name="settings_status_off">Pradėti</string>
|
<string name="settings_status_off">Pradėti</string>
|
||||||
<string name="settings_status_on">Stabdyti</string>
|
<string name="settings_status_on">Stabdyti</string>
|
||||||
<string name="settings_status_off_summary">Tarnyba sustabdyta</string>
|
<string name="settings_status_off_summary">Tarnyba sustabdyta</string>
|
||||||
<string name="settings_status_on_summary">Tarnyba veikia</string>
|
<string name="settings_status_on_summary">Tarnyba veikia</string>
|
||||||
<string name="settings_provider_title">Vietos nustatymas</string>
|
<string name="settings_accuracy_title">Pozicijos tikslumas</string>
|
||||||
<string name="settings_provider_summary">Vietos nustatymo šaltinis</string>
|
<string name="settings_accuracy_summary">Norimas pozicijos tikslumas</string>
|
||||||
<string name="settings_provider_gps">Įrenginio GPS</string>
|
<string name="settings_accuracy_high">Aukštas</string>
|
||||||
<string name="settings_provider_network">GSM tinklas</string>
|
<string name="settings_accuracy_medium">Vidutinis</string>
|
||||||
<string name="settings_provider_mixed">Mišrus: GSM ir GPS</string>
|
<string name="settings_accuracy_low">Žemas</string>
|
||||||
<string name="settings_foreground_title">Žeminti tarnybos prioritetą</string>
|
<string name="settings_foreground_title">Žeminti tarnybos prioritetą</string>
|
||||||
<string name="settings_foreground_summary">Padidinti tarnybos prioritetą</string>
|
<string name="settings_foreground_summary">Padidinti tarnybos prioritetą</string>
|
||||||
<string name="menu_status">Būklė</string>
|
<string name="menu_status">Būklė</string>
|
||||||
<string name="menu_about">Apie</string>
|
|
||||||
<string name="menu_shortcuts">Pridėti nuorodas</string>
|
<string name="menu_shortcuts">Pridėti nuorodas</string>
|
||||||
<string name="menu_clear">Valyti</string>
|
<string name="menu_clear">Valyti</string>
|
||||||
<string name="about_description">GPS sekimo programėlė Android įrenginiams. Suderinta su Traccar Serveriu ir kitomis vietos nustatymo tarnybomis.</string>
|
<string name="status_service_create">Servisas pradėtas</string>
|
||||||
<string name="about_license">Ši programėlė yra nemokama ir atviro kodo. Autorinės teisės yra saugomos pagal Apache Licence Version 2.0 reglamentą (pasiekiama GitHub)</string>
|
<string name="status_service_destroy">Servisas sustabdytas</string>
|
||||||
<string name="about_web">Daugiau informacijos adresu visit\nwww.traccar.org\client</string>
|
<string name="status_send_success">Išsiųsta sėkmingai</string>
|
||||||
<string name="status_send_fail">Klaida siunčiant</string>
|
<string name="status_send_fail">Klaida siunčiant</string>
|
||||||
<string name="status_location_update">Vietos nusatymo duomenų atnaujinimas</string>
|
<string name="status_location_update">Vietos nusatymo duomenų atnaujinimas</string>
|
||||||
<string name="status_connectivity_change">Prisijungimo duomenų pasikeitimas</string>
|
<string name="status_network_online">Prisijungęs prie tinklo</string>
|
||||||
|
<string name="status_network_offline">Atsijungęs nuo tinklo</string>
|
||||||
<string name="hidden_app_name">Įrenginio nustatymai</string>
|
<string name="hidden_app_name">Įrenginio nustatymai</string>
|
||||||
<string name="hidden_alert">Ši programėlė veikia paslėptu režimu. Norint ją atidaryti, prašau skambinti numeriu 8722227 (TRACCAR)</string>
|
<string name="hidden_alert">Ši programėlė veikia paslėptu režimu. Norint ją atidaryti, prašau skambinti numeriu 8722227 (TRACCAR)</string>
|
||||||
|
<string name="error_msg_invalid_url">Įveskite tinkamą http:// ar https:// URL</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar klients</string>
|
<string name="app_name">Traccar klients</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Sākt servisu</string>
|
||||||
|
<string name="shortcut_stop">Apstādināt servisu</string>
|
||||||
|
<string name="shortcut_sos">Sūtīt SOS</string>
|
||||||
|
<string name="channel_default">Primārais kanāls</string>
|
||||||
<string name="settings_id_title">Ierīces identifikators</string>
|
<string name="settings_id_title">Ierīces identifikators</string>
|
||||||
<string name="settings_url_title">Servera URL</string>
|
<string name="settings_url_title">Servera URL</string>
|
||||||
<string name="settings_url_summary">Traccar servera URL</string>
|
<string name="settings_url_summary">Traccar servera URL</string>
|
||||||
@@ -16,25 +20,32 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Serviss apturēts</string>
|
<string name="settings_status_off_summary">Serviss apturēts</string>
|
||||||
<string name="settings_status_on_summary">Serviss darbojas</string>
|
<string name="settings_status_on_summary">Serviss darbojas</string>
|
||||||
<string name="settings_provider_title">Vietas provaiders</string>
|
<string name="settings_buffer">Bezsaistes buferizācija</string>
|
||||||
<string name="settings_provider_summary">Datu atrašanās vietas avots</string>
|
<string name="settings_buffer_off_summary">Buferizācija izslēgta</string>
|
||||||
<string name="settings_provider_gps">GPS provaiders</string>
|
<string name="settings_buffer_on_summary">Buferizācija ieslēgta</string>
|
||||||
<string name="settings_provider_network">Tīkla provaiders</string>
|
<string name="settings_wakelock">Pretaizmigšanas funkcija</string>
|
||||||
<string name="settings_provider_mixed">Miksets provaiders</string>
|
<string name="settings_wakelock_off_summary">Pretaizmigšanas funkcija izslēgta</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Pretaizmigšanas funkcija ieslēgta</string>
|
||||||
|
<string name="settings_accuracy_title">Vietas precizitāte</string>
|
||||||
|
<string name="settings_accuracy_summary">Vēlamās vietas precizitāte</string>
|
||||||
|
<string name="settings_accuracy_high">Augsta</string>
|
||||||
|
<string name="settings_accuracy_medium">Vidēja</string>
|
||||||
|
<string name="settings_accuracy_low">Zema</string>
|
||||||
<string name="settings_foreground_title">Zināšanu servis</string>
|
<string name="settings_foreground_title">Zināšanu servis</string>
|
||||||
<string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string>
|
<string name="settings_foreground_summary">Paaugstināt servisa prioritāti</string>
|
||||||
<string name="menu_status">Statuss</string>
|
<string name="menu_status">Statuss</string>
|
||||||
<string name="menu_about">Par</string>
|
<string name="menu_info">Informācija</string>
|
||||||
<string name="menu_shortcuts">Pievienot saīsnes</string>
|
<string name="menu_shortcuts">Pievienot saīsnes</string>
|
||||||
<string name="menu_clear">Notīrīt</string>
|
<string name="menu_clear">Notīrīt</string>
|
||||||
<string name="about_description">Reāllaika GPS sekošanas ierīce Android ierīcēm. Savietojams ar Traccar Server un citām izsekošanas sistēmām.</string>
|
<string name="status_service_create">Serviss uzsākts</string>
|
||||||
<string name="about_license">Šī lietotne ir bezmaksas un atvērtā koda, avota kods ir licencēts Apache Licence 2.0 versijā un ir pieejams GitHub.</string>
|
<string name="status_service_destroy">Serviss apstādināts</string>
|
||||||
<string name="about_web">Lai iegūtu papildinformāciju, apmeklējiet vietni\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Sūtīšana veiksmīga</string>
|
<string name="status_send_success">Sūtīšana veiksmīga</string>
|
||||||
<string name="status_send_fail">Nosūtīt neizdevās</string>
|
<string name="status_send_fail">Nosūtīt neizdevās</string>
|
||||||
<string name="status_location_update">Lokacijas atjaunināšana</string>
|
<string name="status_location_update">Lokacijas atjaunināšana</string>
|
||||||
<string name="status_connectivity_change">Savienojuma maiņa</string>
|
<string name="status_network_online">Tīkls tiešsaitē</string>
|
||||||
|
<string name="status_network_offline">Tīkls bezsaitē</string>
|
||||||
<string name="hidden_app_name">Ierīces iestatījumi</string>
|
<string name="hidden_app_name">Ierīces iestatījumi</string>
|
||||||
<string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string>
|
<string name="hidden_alert">Lietotne ir paslēpta. Zvaniet 8722227 (TRACCAR), lai to atkal parādītu.</string>
|
||||||
<string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string>
|
<string name="error_msg_invalid_url">Lūdzu ievadiet derīgu http:// vai https:// URL</string>
|
||||||
|
<string name="request_background_option">Visu laiku atļauts</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Klient</string>
|
<string name="app_name">Traccar Klient</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Start tjeneste</string>
|
||||||
|
<string name="shortcut_stop">Stopp tjeneste</string>
|
||||||
|
<string name="shortcut_sos">Send SOS</string>
|
||||||
|
<string name="channel_default">Primer Kanal</string>
|
||||||
<string name="settings_id_title">Enhetsidentifikasjon</string>
|
<string name="settings_id_title">Enhetsidentifikasjon</string>
|
||||||
<string name="settings_url_title">Tjener-nettadresse</string>
|
<string name="settings_url_title">Tjener-nettadresse</string>
|
||||||
<string name="settings_url_summary">Sproringstjener-nettadresse</string>
|
<string name="settings_url_summary">Sproringstjener-nettadresse</string>
|
||||||
@@ -16,24 +20,26 @@
|
|||||||
<string name="settings_status_on">Stopp</string>
|
<string name="settings_status_on">Stopp</string>
|
||||||
<string name="settings_status_off_summary">Tjenesten stoppet</string>
|
<string name="settings_status_off_summary">Tjenesten stoppet</string>
|
||||||
<string name="settings_status_on_summary">Tjenesten kjører</string>
|
<string name="settings_status_on_summary">Tjenesten kjører</string>
|
||||||
<string name="settings_provider_title">Lokaliseringsleverandør</string>
|
<string name="settings_buffer">Frakoblet mellomlagring</string>
|
||||||
<string name="settings_provider_summary">Kilde for lokaliseringsdata</string>
|
<string name="settings_buffer_off_summary">Mellomlagring deaktivert</string>
|
||||||
<string name="settings_provider_gps">GPS-lokalisering</string>
|
<string name="settings_buffer_on_summary">Mellomlagring på</string>
|
||||||
<string name="settings_provider_network">Nettverkslokalisering</string>
|
<string name="settings_accuracy_title">Posisjonsnøyaktighet</string>
|
||||||
<string name="settings_provider_mixed">Blandet lokalisering</string>
|
<string name="settings_accuracy_summary">Ønsket plasseringsnøyaktighet</string>
|
||||||
|
<string name="settings_accuracy_high">Høy</string>
|
||||||
|
<string name="settings_accuracy_medium">Medium</string>
|
||||||
|
<string name="settings_accuracy_low">Lav</string>
|
||||||
<string name="settings_foreground_title">Forgrunnen tjeneste</string>
|
<string name="settings_foreground_title">Forgrunnen tjeneste</string>
|
||||||
<string name="settings_foreground_summary">Øk tjeneste-prioritet</string>
|
<string name="settings_foreground_summary">Øk tjeneste-prioritet</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Om</string>
|
|
||||||
<string name="menu_shortcuts">Legg til snarvei</string>
|
<string name="menu_shortcuts">Legg til snarvei</string>
|
||||||
<string name="menu_clear">Tøm</string>
|
<string name="menu_clear">Tøm</string>
|
||||||
<string name="about_description">Sanntids GPS-sporing for Android-enheter. Kompatibel med Traccar Server og andre sporingssystemer.</string>
|
<string name="status_service_create">Tjeneste startet</string>
|
||||||
<string name="about_license">Dette programmet har fri og åpen kildekode; kildekoden er lisensiert under Apache License Version 2.0 og er tilgjengelig på GitHub.</string>
|
<string name="status_service_destroy">Tjeneste stoppet</string>
|
||||||
<string name="about_web">For mer informasjon besøk\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Sending vellykket</string>
|
<string name="status_send_success">Sending vellykket</string>
|
||||||
<string name="status_send_fail">Sending mislyktes</string>
|
<string name="status_send_fail">Sending mislyktes</string>
|
||||||
<string name="status_location_update">Plassering oppdatert</string>
|
<string name="status_location_update">Plassering oppdatert</string>
|
||||||
<string name="status_connectivity_change">Tilkobling forandret</string>
|
<string name="status_network_online">Nettverk Online</string>
|
||||||
|
<string name="status_network_offline">Nettverk Offline</string>
|
||||||
<string name="hidden_app_name">Enhetsinnstillinger</string>
|
<string name="hidden_app_name">Enhetsinnstillinger</string>
|
||||||
<string name="hidden_alert">App\'en har blitt gjemt. For å åpne igjen, vennligst tast (ring) 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">App\'en har blitt gjemt. For å åpne igjen, vennligst tast (ring) 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Vennligst skriv korrekt nettadresse som http:// eller https://</string>
|
<string name="error_msg_invalid_url">Vennligst skriv korrekt nettadresse som http:// eller https://</string>
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<color name="primary">#2E7D32</color>
|
||||||
|
<color name="primary_dark">#1B5E20</color>
|
||||||
|
<color name="accent">#81C784</color>
|
||||||
|
<color name="light">#FAFAFA</color>
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -2,6 +2,9 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar client</string>
|
<string name="app_name">Traccar client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Start service</string>
|
||||||
|
<string name="shortcut_stop">Stop service</string>
|
||||||
|
<string name="shortcut_sos">Stuur SOS</string>
|
||||||
<string name="channel_default">Standaard kanaal</string>
|
<string name="channel_default">Standaard kanaal</string>
|
||||||
<string name="settings_id_title">Toestelidentificatie</string>
|
<string name="settings_id_title">Toestelidentificatie</string>
|
||||||
<string name="settings_url_title">Server URL</string>
|
<string name="settings_url_title">Server URL</string>
|
||||||
@@ -17,25 +20,34 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Service gestopt</string>
|
<string name="settings_status_off_summary">Service gestopt</string>
|
||||||
<string name="settings_status_on_summary">Service draait</string>
|
<string name="settings_status_on_summary">Service draait</string>
|
||||||
<string name="settings_provider_title">Locatie provider</string>
|
<string name="settings_buffer">Offline bufferen</string>
|
||||||
<string name="settings_provider_summary">Bron van locatie data</string>
|
<string name="settings_buffer_off_summary">Bufferen uit</string>
|
||||||
<string name="settings_provider_gps">GPS provider</string>
|
<string name="settings_buffer_on_summary">Bufferen aan</string>
|
||||||
<string name="settings_provider_network">Netwerk provider</string>
|
<string name="settings_wakelock">Slaapstand blokkade</string>
|
||||||
<string name="settings_provider_mixed">Gecombineerde providers</string>
|
<string name="settings_wakelock_off_summary">Slaapstand blokkade uit</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Slaapstand blokkade aan</string>
|
||||||
|
<string name="settings_accuracy_title">Locatienauwkeurigheid</string>
|
||||||
|
<string name="settings_accuracy_summary">Gewenste lokatienauwkeurigheid</string>
|
||||||
|
<string name="settings_accuracy_high">Hoog</string>
|
||||||
|
<string name="settings_accuracy_medium">Gemiddeld</string>
|
||||||
|
<string name="settings_accuracy_low">Laag</string>
|
||||||
<string name="settings_foreground_title">Voorgrond service</string>
|
<string name="settings_foreground_title">Voorgrond service</string>
|
||||||
<string name="settings_foreground_summary">Verhoog voorrang voor service</string>
|
<string name="settings_foreground_summary">Verhoog voorrang voor service</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Over ons</string>
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Voeg snelkoppelingen toe</string>
|
<string name="menu_shortcuts">Voeg snelkoppelingen toe</string>
|
||||||
<string name="menu_clear">Wis</string>
|
<string name="menu_clear">Wis</string>
|
||||||
<string name="about_description">Real time GPS tracker voor Android apparaten. Compatibel met de Traccar server en andere tracking systemen.</string>
|
<string name="status_service_create">Service gestart</string>
|
||||||
<string name="about_license">Deze toepassing is gratis en open source, de broncode is beschikbaar onder de Apache Licentie versie 2.0 op GitHub.</string>
|
<string name="status_service_destroy">Service gestopt</string>
|
||||||
<string name="about_web">Voor meer informatie bezoek\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Succesvol verstuurd</string>
|
<string name="status_send_success">Succesvol verstuurd</string>
|
||||||
<string name="status_send_fail">Verzenden mislukt</string>
|
<string name="status_send_fail">Verzenden mislukt</string>
|
||||||
<string name="status_location_update">Locatie update</string>
|
<string name="status_location_update">Locatie update</string>
|
||||||
<string name="status_connectivity_change">Verbinding gewijzigd</string>
|
<string name="status_network_online">Netwerk online</string>
|
||||||
|
<string name="status_network_offline">Netwerk offline</string>
|
||||||
<string name="hidden_app_name">Toestel instellingen</string>
|
<string name="hidden_app_name">Toestel instellingen</string>
|
||||||
<string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">De app is verborgen. Om hem opnieuw te openen bel je naar 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string>
|
<string name="error_msg_invalid_url">Voer alstublieft een geldige http:// of https:// URL in</string>
|
||||||
|
<string name="request_exception">Om continu locatiegegevens te kunnen verzamelen is het noodzakelijk dat accuoptimalisatie voor deze app is uitgeschakeld.</string>
|
||||||
|
<string name="request_background">Geef de \"1%s\" permissie om continu locatieinformatie bij te houden.</string>
|
||||||
|
<string name="request_background_option">Altijd toestaan</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,7 +2,13 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">Traccar Client</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Start teneste</string>
|
||||||
|
<string name="shortcut_stop">Stopp teneste</string>
|
||||||
|
<string name="shortcut_sos">Send SOS</string>
|
||||||
|
<string name="channel_default">Hovud kanal</string>
|
||||||
<string name="settings_id_title">Einingsidentifikator</string>
|
<string name="settings_id_title">Einingsidentifikator</string>
|
||||||
|
<string name="settings_url_title">Tenar-URL</string>
|
||||||
|
<string name="settings_url_summary">Sporingstenar-URL</string>
|
||||||
<string name="settings_interval_title">Frekvens</string>
|
<string name="settings_interval_title">Frekvens</string>
|
||||||
<string name="settings_interval_summary">Rapporteringsinterval i sekundar</string>
|
<string name="settings_interval_summary">Rapporteringsinterval i sekundar</string>
|
||||||
<string name="settings_distance_title">Avstand</string>
|
<string name="settings_distance_title">Avstand</string>
|
||||||
@@ -14,24 +20,27 @@
|
|||||||
<string name="settings_status_on">Stopp</string>
|
<string name="settings_status_on">Stopp</string>
|
||||||
<string name="settings_status_off_summary">Teneste stoppa</string>
|
<string name="settings_status_off_summary">Teneste stoppa</string>
|
||||||
<string name="settings_status_on_summary">Tenar køyrer</string>
|
<string name="settings_status_on_summary">Tenar køyrer</string>
|
||||||
<string name="settings_provider_title">Lokaliseringsleverandør</string>
|
<string name="settings_buffer">Fråkopla mellomlagring</string>
|
||||||
<string name="settings_provider_summary">Kilde for lokaliseringsdata</string>
|
<string name="settings_buffer_off_summary">Mellomlagring deaktivert</string>
|
||||||
<string name="settings_provider_gps">GPS-lokalisering</string>
|
<string name="settings_buffer_on_summary">Mellomlagring på</string>
|
||||||
<string name="settings_provider_network">Nettverkslokalisering</string>
|
<string name="settings_accuracy_title">Lokasjonsnøyaktighet</string>
|
||||||
<string name="settings_provider_mixed">Blanda lokalisering</string>
|
<string name="settings_accuracy_summary">Ønska lokasjonsnøyaktighet</string>
|
||||||
|
<string name="settings_accuracy_high">Høg</string>
|
||||||
|
<string name="settings_accuracy_medium">Medium</string>
|
||||||
|
<string name="settings_accuracy_low">Lav</string>
|
||||||
<string name="settings_foreground_title">Forgrunnsteneste</string>
|
<string name="settings_foreground_title">Forgrunnsteneste</string>
|
||||||
<string name="settings_foreground_summary">Auk teneste-prioritet</string>
|
<string name="settings_foreground_summary">Auk teneste-prioritet</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">Om</string>
|
|
||||||
<string name="menu_shortcuts">Legg til snarveg</string>
|
<string name="menu_shortcuts">Legg til snarveg</string>
|
||||||
<string name="menu_clear">Nullstill</string>
|
<string name="menu_clear">Nullstill</string>
|
||||||
<string name="about_description">Sanntids GPS-sporing for Android-einingar. Kompatibel med Traccar Server og andre sporingssystem</string>
|
<string name="status_service_create">Teneste starta</string>
|
||||||
<string name="about_license">Dette programmet har fri og åpen kildekode; kildekoden er lisensiert under Apache License Version 2.0 og er tilgjengeleg på GitHub.</string>
|
<string name="status_service_destroy">Teneste stoppa</string>
|
||||||
<string name="about_web">For meir informasjon besøk\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Send vellukka</string>
|
<string name="status_send_success">Send vellukka</string>
|
||||||
<string name="status_send_fail">Sending feila</string>
|
<string name="status_send_fail">Sending feila</string>
|
||||||
<string name="status_location_update">Plassering oppdatert</string>
|
<string name="status_location_update">Plassering oppdatert</string>
|
||||||
<string name="status_connectivity_change">Tilkopling forandra</string>
|
<string name="status_network_online">Nettverk tilkopla</string>
|
||||||
|
<string name="status_network_offline">Nettverk fråkopla</string>
|
||||||
<string name="hidden_app_name">Einingsinnstillingar</string>
|
<string name="hidden_app_name">Einingsinnstillingar</string>
|
||||||
<string name="hidden_alert">App\'en har blitt gøymt. For å åpne han igjen, ver venleg å tast (ring) 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">App\'en har blitt gøymt. For å åpne han igjen, ver venleg å tast (ring) 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Ver venleg å taste gyldig http:// eller https:// URL</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,40 +1,53 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Klient Traccar</string>
|
<string name="app_name">Traccar Klient</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Uruchomienie usługi</string>
|
||||||
|
<string name="shortcut_stop">Zatrzymanie usługi</string>
|
||||||
|
<string name="shortcut_sos">Wyślij SOS</string>
|
||||||
|
<string name="channel_default">Podstawowy kanał</string>
|
||||||
<string name="settings_id_title">Identyfikator urządzenia</string>
|
<string name="settings_id_title">Identyfikator urządzenia</string>
|
||||||
<string name="settings_url_title">URL Serwera</string>
|
<string name="settings_url_title">URL Serwera</string>
|
||||||
<string name="settings_url_summary">URL serwera śledzącego</string>
|
<string name="settings_url_summary">URL serwera śledzącego</string>
|
||||||
<string name="settings_interval_title">Częstotliwość</string>
|
<string name="settings_interval_title">Częstotliwość</string>
|
||||||
<string name="settings_interval_summary">Interwał raportów w sekundach</string>
|
<string name="settings_interval_summary">Interwał raportowania w sekundach</string>
|
||||||
<string name="settings_distance_title">Dystans</string>
|
<string name="settings_distance_title">Dystans</string>
|
||||||
<string name="settings_distance_summary">Dystans raportu w metrach</string>
|
<string name="settings_distance_summary">Dystans raportowania w metrach</string>
|
||||||
<string name="settings_angle_title">Kąt</string>
|
<string name="settings_angle_title">Kąt</string>
|
||||||
<string name="settings_angle_summary">Kąt raportu w stopniach</string>
|
<string name="settings_angle_summary">Kąt raportowania w stopniach</string>
|
||||||
<string name="settings_status_title">Status usługi</string>
|
<string name="settings_status_title">Status usługi</string>
|
||||||
<string name="settings_status_off">Uruchom</string>
|
<string name="settings_status_off">Uruchom</string>
|
||||||
<string name="settings_status_on">Zatrzymaj</string>
|
<string name="settings_status_on">Zatrzymaj</string>
|
||||||
<string name="settings_status_off_summary">Usługa zatrzymana</string>
|
<string name="settings_status_off_summary">Usługa zatrzymana</string>
|
||||||
<string name="settings_status_on_summary">Usługa uruchomiona</string>
|
<string name="settings_status_on_summary">Usługa uruchomiona</string>
|
||||||
<string name="settings_provider_title">Dostawca lokalizacji</string>
|
<string name="settings_buffer">Buforowanie offline</string>
|
||||||
<string name="settings_provider_summary">Źródło danych o lokalizacji</string>
|
<string name="settings_buffer_off_summary">Buforowanie wyłączone</string>
|
||||||
<string name="settings_provider_gps">GPS</string>
|
<string name="settings_buffer_on_summary">Buforowanie włączone</string>
|
||||||
<string name="settings_provider_network">Sieć</string>
|
<string name="settings_wakelock">Wybudź blokadę</string>
|
||||||
<string name="settings_provider_mixed">Mieszane</string>
|
<string name="settings_wakelock_off_summary">Wybudzenie blokady wyłączone</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Wybudzenie blokady włączone</string>
|
||||||
|
<string name="settings_accuracy_title">Dokładność lokalizacji</string>
|
||||||
|
<string name="settings_accuracy_summary">Żądana dokładność lokalizacji</string>
|
||||||
|
<string name="settings_accuracy_high">Wysoka</string>
|
||||||
|
<string name="settings_accuracy_medium">Średnia</string>
|
||||||
|
<string name="settings_accuracy_low">Niska</string>
|
||||||
<string name="settings_foreground_title">Usługa pierwszoplanowa</string>
|
<string name="settings_foreground_title">Usługa pierwszoplanowa</string>
|
||||||
<string name="settings_foreground_summary">Zwiększ priorytet usługi</string>
|
<string name="settings_foreground_summary">Zwiększ priorytet usługi</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">O Traccar</string>
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Dodaj skróty</string>
|
<string name="menu_shortcuts">Dodaj skróty</string>
|
||||||
<string name="menu_clear">Wyczyść</string>
|
<string name="menu_clear">Wyczyść</string>
|
||||||
<string name="about_description">Monitor GPS dla urządzeń Android. Kompatybilny z serwerem Traccar oraz innymi platformami śledzącymi.</string>
|
<string name="status_service_create">Usługa uruchomiona</string>
|
||||||
<string name="about_license">Ta aplikacja jest darmowa i otwartoźródłowa. Kod źródłowy jest licencjonowany Apache License Version 2.0 i jest dostępny na GitHub.</string>
|
<string name="status_service_destroy">Usługa zatrzymana</string>
|
||||||
<string name="about_web">Więcej informacji - odwiedź\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Wysłane poprawnie</string>
|
<string name="status_send_success">Wysłane poprawnie</string>
|
||||||
<string name="status_send_fail">Wysłanie nieudane</string>
|
<string name="status_send_fail">Wysłanie nieudane</string>
|
||||||
<string name="status_location_update">Aktualizacja lokalizacji</string>
|
<string name="status_location_update">Aktualizacja lokalizacji</string>
|
||||||
<string name="status_connectivity_change">Zmiana połączenia</string>
|
<string name="status_network_online">Połączony z siecią</string>
|
||||||
|
<string name="status_network_offline">Rozłączony z siecią</string>
|
||||||
<string name="hidden_app_name">Ustawienia urządzenia</string>
|
<string name="hidden_app_name">Ustawienia urządzenia</string>
|
||||||
<string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikacja została ukryta. By ją otworzyć, zadzwoń pod 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string>
|
<string name="error_msg_invalid_url">Wprowadź poprawny adres http:// lub https:// URL</string>
|
||||||
|
<string name="request_exception">Do stałego zbierania danych o lokalizacji, należy wyłączyć optymalizację baterii w aplikacji.</string>
|
||||||
|
<string name="request_background">Włącz zezwolenie \"%s\", aby ciągle zbierać dane o lokalizacji.</string>
|
||||||
|
<string name="request_background_option">Pozwól cały czas</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,7 +2,11 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Cliente Traccar</string>
|
<string name="app_name">Cliente Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
<string name="settings_id_title">Identificador único</string>
|
<string name="shortcut_start">Iniciar serviço</string>
|
||||||
|
<string name="shortcut_stop">Parar serviço</string>
|
||||||
|
<string name="shortcut_sos">Enviar SOS</string>
|
||||||
|
<string name="channel_default">Canal Principal</string>
|
||||||
|
<string name="settings_id_title">Identificador do dispositivo</string>
|
||||||
<string name="settings_url_title">URL do Servidor</string>
|
<string name="settings_url_title">URL do Servidor</string>
|
||||||
<string name="settings_url_summary">URL do servidor de rastreamento</string>
|
<string name="settings_url_summary">URL do servidor de rastreamento</string>
|
||||||
<string name="settings_interval_title">Invervalo</string>
|
<string name="settings_interval_title">Invervalo</string>
|
||||||
@@ -16,25 +20,34 @@
|
|||||||
<string name="settings_status_on">Parar</string>
|
<string name="settings_status_on">Parar</string>
|
||||||
<string name="settings_status_off_summary">Serviço Parado</string>
|
<string name="settings_status_off_summary">Serviço Parado</string>
|
||||||
<string name="settings_status_on_summary">Serviço em execução</string>
|
<string name="settings_status_on_summary">Serviço em execução</string>
|
||||||
<string name="settings_provider_title">Provedor de localização</string>
|
<string name="settings_buffer">Offline buffering</string>
|
||||||
<string name="settings_provider_summary">Fonte dos dados de localização</string>
|
<string name="settings_buffer_off_summary">Buffering Desligado</string>
|
||||||
<string name="settings_provider_gps">Provedor GPS</string>
|
<string name="settings_buffer_on_summary">Buffering Ligado</string>
|
||||||
<string name="settings_provider_network">Provedor Rede</string>
|
<string name="settings_wakelock">Bloqueio de Ativação</string>
|
||||||
<string name="settings_provider_mixed">Provedor Misto</string>
|
<string name="settings_wakelock_off_summary">Bloqueio de Ativação Desligado</string>
|
||||||
<string name="settings_foreground_title">Serviço primeiro plano</string>
|
<string name="settings_wakelock_on_summary">Bloqueio de Ativação Ligado</string>
|
||||||
<string name="settings_foreground_summary">Aumentar a prioridade de serviço</string>
|
<string name="settings_accuracy_title">Precisão de localização</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="settings_accuracy_summary">Precisão de localização desejada</string>
|
||||||
<string name="menu_about">Sobre</string>
|
<string name="settings_accuracy_high">Alto</string>
|
||||||
|
<string name="settings_accuracy_medium">Médio</string>
|
||||||
|
<string name="settings_accuracy_low">Baixo</string>
|
||||||
|
<string name="settings_foreground_title">Serviço em primeiro plano</string>
|
||||||
|
<string name="settings_foreground_summary">Aumentar a prioridade do serviço</string>
|
||||||
|
<string name="menu_status">Estado</string>
|
||||||
|
<string name="menu_info">Informação</string>
|
||||||
<string name="menu_shortcuts">Adicionar atalhos</string>
|
<string name="menu_shortcuts">Adicionar atalhos</string>
|
||||||
<string name="menu_clear">Limpar</string>
|
<string name="menu_clear">Limpar</string>
|
||||||
<string name="about_description">Rastreador GPS Real Time para dispositivos Android. Compatível com servidor Traccar e outros sistemas de rastreamento.</string>
|
<string name="status_service_create">Serviço iniciado</string>
|
||||||
<string name="about_license">Esta aplicação é livre e de código aberto, o código fonte é licenciado sob a licença Apache Versão 2.0 e disponível no GitHub.</string>
|
<string name="status_service_destroy">Serviço parado</string>
|
||||||
<string name="about_web">Para mais informações visite\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Enviado com Sucesso</string>
|
<string name="status_send_success">Enviado com Sucesso</string>
|
||||||
<string name="status_send_fail">Falha no envio</string>
|
<string name="status_send_fail">Falha no envio</string>
|
||||||
<string name="status_location_update">Localização atualizada</string>
|
<string name="status_location_update">Localização atualizada</string>
|
||||||
<string name="status_connectivity_change">Mudança de conectividade</string>
|
<string name="status_network_online">Rede online</string>
|
||||||
|
<string name="status_network_offline">Rede offline</string>
|
||||||
<string name="hidden_app_name">Configurações do Dispositivo</string>
|
<string name="hidden_app_name">Configurações do Dispositivo</string>
|
||||||
<string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">O aplicativo foi escondido. Para abrir novamente por favor digite 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Digite um URL http: // ou https: // válido</string>
|
<string name="error_msg_invalid_url">Digite uma URL http: // ou https: // válida</string>
|
||||||
|
<string name="request_exception">Para coletar dados de localização continuamente por favor desabilite a economia de bateria para o aplicativo.</string>
|
||||||
|
<string name="request_background">Para coletar dados de localização continuamente por favor habilite a permissão \"%s\".</string>
|
||||||
|
<string name="request_background_option">Permitir sempre</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,31 +2,48 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Cliente Traccar</string>
|
<string name="app_name">Cliente Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Iniciar serviço</string>
|
||||||
|
<string name="shortcut_stop">Parar serviço</string>
|
||||||
|
<string name="shortcut_sos">Enviar SOS</string>
|
||||||
|
<string name="channel_default">Canal Principal</string>
|
||||||
<string name="settings_id_title">Identificador único</string>
|
<string name="settings_id_title">Identificador único</string>
|
||||||
|
<string name="settings_url_title">URL do Servidor</string>
|
||||||
|
<string name="settings_url_summary">URL do servidor de rastreamento</string>
|
||||||
<string name="settings_interval_title">Invervalo</string>
|
<string name="settings_interval_title">Invervalo</string>
|
||||||
|
<string name="settings_interval_summary">Intervalo de relatórios em segundos</string>
|
||||||
|
<string name="settings_distance_title">Distância</string>
|
||||||
|
<string name="settings_distance_summary">Distância de relatórios em metros</string>
|
||||||
|
<string name="settings_angle_title">Ângulo</string>
|
||||||
|
<string name="settings_angle_summary">Ângulo de relatório em graus</string>
|
||||||
<string name="settings_status_title">Status do Serviço</string>
|
<string name="settings_status_title">Status do Serviço</string>
|
||||||
<string name="settings_status_off">Iniciar</string>
|
<string name="settings_status_off">Iniciar</string>
|
||||||
<string name="settings_status_on">Parar</string>
|
<string name="settings_status_on">Parar</string>
|
||||||
<string name="settings_status_off_summary">Serviço Parado</string>
|
<string name="settings_status_off_summary">Serviço Parado</string>
|
||||||
<string name="settings_status_on_summary">Serviço em execução</string>
|
<string name="settings_status_on_summary">Serviço em execução</string>
|
||||||
<string name="settings_provider_title">Provedor de localização</string>
|
<string name="settings_buffer">Buffering Offline</string>
|
||||||
<string name="settings_provider_summary">Fonte dos dados de localização</string>
|
<string name="settings_buffer_off_summary">Buffering desligado</string>
|
||||||
<string name="settings_provider_gps">Provedor GPS</string>
|
<string name="settings_buffer_on_summary">Buffering ligado</string>
|
||||||
<string name="settings_provider_network">Provedor Rede</string>
|
<string name="settings_wakelock">Bloqueio de Ativação</string>
|
||||||
<string name="settings_provider_mixed">Provedor Misto</string>
|
<string name="settings_wakelock_off_summary">Bloqueio de Ativação Desligado</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Bloqueio de Ativação Ligado</string>
|
||||||
|
<string name="settings_accuracy_title">Precisão de localização</string>
|
||||||
|
<string name="settings_accuracy_summary">Precisão de localização desejada</string>
|
||||||
|
<string name="settings_accuracy_high">Alto</string>
|
||||||
|
<string name="settings_accuracy_medium">Médio</string>
|
||||||
|
<string name="settings_accuracy_low">Baixo</string>
|
||||||
<string name="settings_foreground_title">Serviço primeiro plano</string>
|
<string name="settings_foreground_title">Serviço primeiro plano</string>
|
||||||
<string name="settings_foreground_summary">Aumentar a prioridade de serviço</string>
|
<string name="settings_foreground_summary">Aumentar a prioridade de serviço</string>
|
||||||
<string name="menu_status">Estado</string>
|
<string name="menu_status">Estado</string>
|
||||||
<string name="menu_about">Sobre</string>
|
|
||||||
<string name="menu_shortcuts">Adicionar Atalhos</string>
|
<string name="menu_shortcuts">Adicionar Atalhos</string>
|
||||||
<string name="menu_clear">Limpar</string>
|
<string name="menu_clear">Limpar</string>
|
||||||
<string name="about_description">Localizador GPS em tempo real para dispositivos Android. Compatível com servidor Traccar e outros sistemas de localização.</string>
|
<string name="status_service_create">Serviço Iniciado</string>
|
||||||
<string name="about_license">Esta aplicação é livre e de código aberto, o código fonte é licenciado sob a licença Apache Versão 2.0 e disponível no GitHub.</string>
|
<string name="status_service_destroy">Serviço Parado</string>
|
||||||
<string name="about_web">Para mais informações visite \nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Enviado com Sucesso</string>
|
<string name="status_send_success">Enviado com Sucesso</string>
|
||||||
<string name="status_send_fail">Falha no envio</string>
|
<string name="status_send_fail">Falha no envio</string>
|
||||||
<string name="status_location_update">Localização atualizada</string>
|
<string name="status_location_update">Localização atualizada</string>
|
||||||
<string name="status_connectivity_change">Mudança de conectividade</string>
|
<string name="status_network_online">Rede online</string>
|
||||||
|
<string name="status_network_offline">Rede offline</string>
|
||||||
<string name="hidden_app_name">Definições do Dispositivo</string>
|
<string name="hidden_app_name">Definições do Dispositivo</string>
|
||||||
<string name="hidden_alert">A aplicação foi ocultada com sucesso. Para abrir novamente, por favor contacte 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">A aplicação foi ocultada com sucesso. Para abrir novamente, por favor contacte 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Digite um URL http: // ou https: // válido</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Client Traccar</string>
|
<string name="app_name">Client Traccar</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Porneste Serviciu</string>
|
||||||
|
<string name="shortcut_stop">Opreste serviciu</string>
|
||||||
|
<string name="shortcut_sos">Trimite SOS</string>
|
||||||
|
<string name="channel_default">Canal Principal</string>
|
||||||
<string name="settings_id_title">Identificare dispozitiv</string>
|
<string name="settings_id_title">Identificare dispozitiv</string>
|
||||||
<string name="settings_url_title">Adresa server</string>
|
<string name="settings_url_title">Adresa server</string>
|
||||||
<string name="settings_url_summary">Adresa serverului de localizare</string>
|
<string name="settings_url_summary">Adresa serverului de localizare</string>
|
||||||
@@ -16,24 +20,23 @@
|
|||||||
<string name="settings_status_on">Oprit</string>
|
<string name="settings_status_on">Oprit</string>
|
||||||
<string name="settings_status_off_summary">Serviciu Oprit</string>
|
<string name="settings_status_off_summary">Serviciu Oprit</string>
|
||||||
<string name="settings_status_on_summary">Serviciul rulează</string>
|
<string name="settings_status_on_summary">Serviciul rulează</string>
|
||||||
<string name="settings_provider_title">Furnizor locaţie</string>
|
<string name="settings_accuracy_title">Acuratete localizare</string>
|
||||||
<string name="settings_provider_summary">Sursă date localizare</string>
|
<string name="settings_accuracy_summary">Acuratete dorita pentru localizare</string>
|
||||||
<string name="settings_provider_gps">Furnizor GPS</string>
|
<string name="settings_accuracy_high">Inalt</string>
|
||||||
<string name="settings_provider_network">Furnizor Reţea</string>
|
<string name="settings_accuracy_medium">Mediu</string>
|
||||||
<string name="settings_provider_mixed">Furnizor Mixt</string>
|
<string name="settings_accuracy_low">Jos</string>
|
||||||
<string name="settings_foreground_title">Serviciul prim-plan</string>
|
<string name="settings_foreground_title">Serviciul prim-plan</string>
|
||||||
<string name="settings_foreground_summary">Creştere prioritate serviciu</string>
|
<string name="settings_foreground_summary">Creştere prioritate serviciu</string>
|
||||||
<string name="menu_status">Stare</string>
|
<string name="menu_status">Stare</string>
|
||||||
<string name="menu_about">Despre</string>
|
|
||||||
<string name="menu_shortcuts">Adăugare scurtătură</string>
|
<string name="menu_shortcuts">Adăugare scurtătură</string>
|
||||||
<string name="menu_clear">Golire</string>
|
<string name="menu_clear">Golire</string>
|
||||||
<string name="about_description">Localizare GPS în timp real pentru dispozitive Android. Compatibil cu Server Traccar si alte sisteme de localizare.</string>
|
<string name="status_service_create">Serviciu pornit</string>
|
||||||
<string name="about_license">Aplicaţia este gratuită şi open source, codul sursă este licenţiat sub Apache License Version 2.0 şi este disponibil pe GitHub.</string>
|
<string name="status_service_destroy">Serviciu oprit</string>
|
||||||
<string name="about_web">Pentru mai multe informaţii vizitaţi\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Expediat</string>
|
<string name="status_send_success">Expediat</string>
|
||||||
<string name="status_send_fail">Trimitere eşuată</string>
|
<string name="status_send_fail">Trimitere eşuată</string>
|
||||||
<string name="status_location_update">Actualizare locaţie</string>
|
<string name="status_location_update">Actualizare locaţie</string>
|
||||||
<string name="status_connectivity_change">Schimbare conectivitate</string>
|
<string name="status_network_online">Retea pornita</string>
|
||||||
|
<string name="status_network_offline">Retea oprita</string>
|
||||||
<string name="hidden_app_name">Setări Dispozitiv</string>
|
<string name="hidden_app_name">Setări Dispozitiv</string>
|
||||||
<string name="hidden_alert">Aplicaţia este ascunsă. Pentru deschidere vă rugam apelaţi numărul de telefon 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplicaţia este ascunsă. Pentru deschidere vă rugam apelaţi numărul de telefon 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Introduceti o adresa valida http:// sau https://</string>
|
<string name="error_msg_invalid_url">Introduceti o adresa valida http:// sau https://</string>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Клиент</string>
|
<string name="app_name">Traccar Клиент</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Запуск сервиса</string>
|
||||||
|
<string name="shortcut_stop">Остановка сервиса</string>
|
||||||
|
<string name="shortcut_sos">Отправка SOS</string>
|
||||||
|
<string name="channel_default">Первичный канал</string>
|
||||||
<string name="settings_id_title">Идентификатор устройства</string>
|
<string name="settings_id_title">Идентификатор устройства</string>
|
||||||
<string name="settings_url_title">URL сервера</string>
|
<string name="settings_url_title">URL сервера</string>
|
||||||
<string name="settings_url_summary">URL телематического сервера</string>
|
<string name="settings_url_summary">URL телематического сервера</string>
|
||||||
@@ -16,25 +20,30 @@
|
|||||||
<string name="settings_status_on">Стоп</string>
|
<string name="settings_status_on">Стоп</string>
|
||||||
<string name="settings_status_off_summary">Сервис остановлен</string>
|
<string name="settings_status_off_summary">Сервис остановлен</string>
|
||||||
<string name="settings_status_on_summary">Сервис запущен</string>
|
<string name="settings_status_on_summary">Сервис запущен</string>
|
||||||
<string name="settings_provider_title">Провайдер местоположения</string>
|
<string name="settings_buffer">Оффлайн буферизация</string>
|
||||||
<string name="settings_provider_summary">Источник данных о местоположении</string>
|
<string name="settings_buffer_off_summary">Буферизация выключена</string>
|
||||||
<string name="settings_provider_gps">GPS провайдер</string>
|
<string name="settings_buffer_on_summary">Буферизация включена</string>
|
||||||
<string name="settings_provider_network">Сетевой провайдер</string>
|
<string name="settings_wakelock">Блокировка пробуждения</string>
|
||||||
<string name="settings_provider_mixed">Смешанный провайдер</string>
|
<string name="settings_wakelock_off_summary">Блокировка выключена</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Блокировка включена</string>
|
||||||
|
<string name="settings_accuracy_title">Точность местоположения</string>
|
||||||
|
<string name="settings_accuracy_summary">Точность местоположения</string>
|
||||||
|
<string name="settings_accuracy_high">Высокая</string>
|
||||||
|
<string name="settings_accuracy_medium">Средняя</string>
|
||||||
|
<string name="settings_accuracy_low">Низкая</string>
|
||||||
<string name="settings_foreground_title">Приоритетный сервис</string>
|
<string name="settings_foreground_title">Приоритетный сервис</string>
|
||||||
<string name="settings_foreground_summary">Увеличить приоритет сервиса</string>
|
<string name="settings_foreground_summary">Увеличить приоритет сервиса</string>
|
||||||
<string name="menu_status">Состояние</string>
|
<string name="menu_status">Состояние</string>
|
||||||
<string name="menu_about">О программе</string>
|
|
||||||
<string name="menu_shortcuts">Добавить ярлыки</string>
|
<string name="menu_shortcuts">Добавить ярлыки</string>
|
||||||
<string name="menu_clear">Очистить</string>
|
<string name="menu_clear">Очистить</string>
|
||||||
<string name="about_description">Трекер для Android устройств. Совместим с Traccar сервером и другими мониторинговыми системами.</string>
|
<string name="status_service_create">Сервис запущен</string>
|
||||||
<string name="about_license">Это приложение распростаняется бесплатно, исходный код распростаняется по лицензии Apache License Version 2.0 и доступен на GitHub.</string>
|
<string name="status_service_destroy">Сервис остановлен</string>
|
||||||
<string name="about_web">Для получения дополнительной информации посетите\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Отправка успешна</string>
|
<string name="status_send_success">Отправка успешна</string>
|
||||||
<string name="status_send_fail">Ошибка отправки</string>
|
<string name="status_send_fail">Ошибка отправки</string>
|
||||||
<string name="status_location_update">Обновление местоположения</string>
|
<string name="status_location_update">Обновление местоположения</string>
|
||||||
<string name="status_connectivity_change">Изменение подключения</string>
|
<string name="status_network_online">Сеть онлайн</string>
|
||||||
<string name="hidden_app_name">Настройки устройтва</string>
|
<string name="status_network_offline">Сеть оффлайн</string>
|
||||||
|
<string name="hidden_app_name">Настройки устройства</string>
|
||||||
<string name="hidden_alert">Приложение было спрятано. Чтобы открыть позвоните на номер 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Приложение было спрятано. Чтобы открыть позвоните на номер 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Пожалуйста, введите верный http:// или https:// URL</string>
|
<string name="error_msg_invalid_url">Пожалуйста, введите верный http:// или https:// URL</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -1,30 +1,28 @@
|
|||||||
<?xml version='1.0' encoding='UTF-8'?>
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Client</string>
|
<string name="app_name">ට්රැකකාර් අනුග්රාහකය</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">ට්රැකකාර්</string>
|
||||||
<string name="settings_id_title">උපකරණ හඳුන්වනය</string>
|
<string name="shortcut_start">සේවාව නවතන්න</string>
|
||||||
|
<string name="shortcut_stop">සේවාව නවතන්න</string>
|
||||||
|
<string name="settings_id_title">උපාංගයේ හඳුන්වනය</string>
|
||||||
|
<string name="settings_url_title">සේවාදායකයේ ඒ.ස.නි.</string>
|
||||||
|
<string name="settings_url_summary">ලුහුබැඳීමේ සේවාදායකයේ ඒ.ස.නි.</string>
|
||||||
<string name="settings_interval_title">සංඛ්යාතය</string>
|
<string name="settings_interval_title">සංඛ්යාතය</string>
|
||||||
<string name="settings_status_title">සේවා තත්වය</string>
|
<string name="settings_status_title">සේවාවේ තත්වය</string>
|
||||||
<string name="settings_status_off">ඇරැඹීම</string>
|
<string name="settings_status_off">අරඹන්න</string>
|
||||||
<string name="settings_status_on">නැවතීම</string>
|
<string name="settings_status_on">නවත්වන්න</string>
|
||||||
<string name="settings_status_off_summary">සේවාව අක්රීයයි</string>
|
<string name="settings_status_off_summary">සේවාව නවතා ඇත</string>
|
||||||
<string name="settings_status_on_summary">සේවාව ක්රියාත්මකයි</string>
|
<string name="settings_status_on_summary">සේවාව ධාවනය වෙමින්</string>
|
||||||
<string name="settings_provider_title">Location provider</string>
|
<string name="settings_foreground_title">පෙරබිම් සේවාව</string>
|
||||||
<string name="settings_provider_summary">Source of location data</string>
|
<string name="settings_foreground_summary">සේවාවේ ප්රමුඛත්වය වැඩිකරන්න</string>
|
||||||
<string name="settings_provider_gps">GPS provider</string>
|
|
||||||
<string name="settings_provider_network">Network provider</string>
|
|
||||||
<string name="settings_provider_mixed">Mixed provider</string>
|
|
||||||
<string name="settings_foreground_title">Foreground service</string>
|
|
||||||
<string name="settings_foreground_summary">Increase service priority</string>
|
|
||||||
<string name="menu_status">තත්වය</string>
|
<string name="menu_status">තත්වය</string>
|
||||||
<string name="menu_about">පිළිබඳ</string>
|
<string name="menu_info">තොරතුරු</string>
|
||||||
<string name="menu_shortcuts">කෙටි මං එකතු කරන්න</string>
|
<string name="menu_shortcuts">කෙටිමං එකතු කරන්න</string>
|
||||||
<string name="menu_clear">හිස් කරන්න</string>
|
<string name="menu_clear">හිස් කරන්න</string>
|
||||||
<string name="about_description">Real time GPS tracker for Android devices. Compatible with Traccar Server and other tracking systems.</string>
|
<string name="status_service_create">සේවාව ඇරඹිණි</string>
|
||||||
<string name="about_license">This application is free and open source, source code is licensed under Apache License Version 2.0 and available on GitHub.</string>
|
<string name="status_service_destroy">සේවාව නැවතිණි</string>
|
||||||
<string name="about_web">For more information visit\nwww.traccar.org/client</string>
|
<string name="status_send_success">සාර්ථකව යැවිණි</string>
|
||||||
<string name="status_send_fail">යැවිය නොහැකිය</string>
|
<string name="status_send_fail">යැවීමට අසමත් විය</string>
|
||||||
<string name="status_location_update">Location update</string>
|
<string name="status_location_update">ස්ථානය යාවත්කාලය</string>
|
||||||
<string name="status_connectivity_change">Connectivity change</string>
|
|
||||||
<string name="hidden_app_name">උපකරණ සැකසුම්</string>
|
<string name="hidden_app_name">උපකරණ සැකසුම්</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar Manager</string>
|
<string name="app_name">Traccar Manager</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Spustiť službu</string>
|
||||||
|
<string name="shortcut_stop">Zastaviť službu</string>
|
||||||
|
<string name="shortcut_sos">Poslať SOS</string>
|
||||||
|
<string name="channel_default">Primárny kanál</string>
|
||||||
<string name="settings_id_title">Identifikátor zariadenia</string>
|
<string name="settings_id_title">Identifikátor zariadenia</string>
|
||||||
<string name="settings_url_title">URL server</string>
|
<string name="settings_url_title">URL server</string>
|
||||||
<string name="settings_url_summary">Sledovanie URL serveru</string>
|
<string name="settings_url_summary">Sledovanie URL serveru</string>
|
||||||
@@ -16,24 +20,23 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Služba sa zastavila</string>
|
<string name="settings_status_off_summary">Služba sa zastavila</string>
|
||||||
<string name="settings_status_on_summary">Služba beží</string>
|
<string name="settings_status_on_summary">Služba beží</string>
|
||||||
<string name="settings_provider_title">Poskytovateľ polohy</string>
|
<string name="settings_accuracy_title">Presnosť lokalizácie</string>
|
||||||
<string name="settings_provider_summary">Zdroj polohovacích údajov</string>
|
<string name="settings_accuracy_summary">Požadovaná presnosť lokalizácie</string>
|
||||||
<string name="settings_provider_gps">Poskytovateľ GPS</string>
|
<string name="settings_accuracy_high">Vysoká</string>
|
||||||
<string name="settings_provider_network">Poskytovateľ sieťových služieb</string>
|
<string name="settings_accuracy_medium">Stredná</string>
|
||||||
<string name="settings_provider_mixed">Mix poskytovateľ </string>
|
<string name="settings_accuracy_low">Nízka</string>
|
||||||
<string name="settings_foreground_title">Služba v popredí</string>
|
<string name="settings_foreground_title">Služba v popredí</string>
|
||||||
<string name="settings_foreground_summary">Zvýšiť prioritu servis</string>
|
<string name="settings_foreground_summary">Zvýšiť prioritu servis</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">O</string>
|
|
||||||
<string name="menu_shortcuts">Pridanie skratiek</string>
|
<string name="menu_shortcuts">Pridanie skratiek</string>
|
||||||
<string name="menu_clear">Vyčistiť</string>
|
<string name="menu_clear">Vyčistiť</string>
|
||||||
<string name="about_description">Real time GPS tracker pre Android zariadenia. Kompatibilný s Traccar Serverom a ďalšími sledovacími systémami.</string>
|
<string name="status_service_create">Služba spustená</string>
|
||||||
<string name="about_license">Táto aplikácia je zadarmo a open source, zdrojový kód pod licenciou Apache License verzie 2.0 a je k dispozícii na GitHub.</string>
|
<string name="status_service_destroy">Služba zastavená</string>
|
||||||
<string name="about_web">Pre viac informácií navštívte visit\nwww.traccar.org/client</string>
|
|
||||||
<string name="status_send_success">Úspešne poslané</string>
|
<string name="status_send_success">Úspešne poslané</string>
|
||||||
<string name="status_send_fail">Odoslanie zlyhalo</string>
|
<string name="status_send_fail">Odoslanie zlyhalo</string>
|
||||||
<string name="status_location_update">Aktualizácia polohy</string>
|
<string name="status_location_update">Aktualizácia polohy</string>
|
||||||
<string name="status_connectivity_change">Zmena konektivity</string>
|
<string name="status_network_online">Sieť online</string>
|
||||||
|
<string name="status_network_offline">Sieť offline</string>
|
||||||
<string name="hidden_app_name">Nastavenie zariadenia</string>
|
<string name="hidden_app_name">Nastavenie zariadenia</string>
|
||||||
<string name="hidden_alert">Aplikácia bola skrytá. Pre opätovné otvorenie znova vytočte 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikácia bola skrytá. Pre opätovné otvorenie znova vytočte 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Prosím zadajte validné http:// alebo https:// URL</string>
|
<string name="error_msg_invalid_url">Prosím zadajte validné http:// alebo https:// URL</string>
|
||||||
|
|||||||
@@ -2,13 +2,42 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">Traccar klient</string>
|
<string name="app_name">Traccar klient</string>
|
||||||
<string name="app_logo">Traccar</string>
|
<string name="app_logo">Traccar</string>
|
||||||
|
<string name="shortcut_start">Zaženi storitev</string>
|
||||||
|
<string name="shortcut_stop">Ustavi storitev</string>
|
||||||
|
<string name="shortcut_sos">Pošlji SOS</string>
|
||||||
|
<string name="channel_default">Glavni kanal</string>
|
||||||
|
<string name="settings_id_title">Identifikator naprave</string>
|
||||||
|
<string name="settings_url_title">URL strežnika</string>
|
||||||
|
<string name="settings_url_summary">ULR naslov strežnika za sledenje</string>
|
||||||
|
<string name="settings_interval_title">Frekvenca</string>
|
||||||
|
<string name="settings_interval_summary">Pogostost pošiljanja v sekundah</string>
|
||||||
|
<string name="settings_distance_title">Razdalja</string>
|
||||||
|
<string name="settings_distance_summary">Razdalja med pošiljanji v metrih</string>
|
||||||
|
<string name="settings_angle_title">Kot</string>
|
||||||
|
<string name="settings_angle_summary">Kot med pošiljanji v stopinjah</string>
|
||||||
|
<string name="settings_status_title">Stanje storitve</string>
|
||||||
<string name="settings_status_off">Zaženi</string>
|
<string name="settings_status_off">Zaženi</string>
|
||||||
<string name="settings_status_on">Ustavi</string>
|
<string name="settings_status_on">Ustavi</string>
|
||||||
<string name="settings_status_off_summary">Servis ustavljen</string>
|
<string name="settings_status_off_summary">Storitev ustavljena</string>
|
||||||
<string name="settings_status_on_summary">Servis teče</string>
|
<string name="settings_status_on_summary">Storitev zagnana</string>
|
||||||
|
<string name="settings_accuracy_title">Natančnost lokacije</string>
|
||||||
|
<string name="settings_accuracy_summary">Željena natančnost lokacije</string>
|
||||||
|
<string name="settings_accuracy_high">Visoka</string>
|
||||||
|
<string name="settings_accuracy_medium">Srednja</string>
|
||||||
|
<string name="settings_accuracy_low">Nizka</string>
|
||||||
|
<string name="settings_foreground_title">Storitev v ospredju</string>
|
||||||
|
<string name="settings_foreground_summary">Povečaj prioriteto storitve</string>
|
||||||
<string name="menu_status">Stanje</string>
|
<string name="menu_status">Stanje</string>
|
||||||
|
<string name="menu_shortcuts">Dodaj bližnjice</string>
|
||||||
<string name="menu_clear">Počisti</string>
|
<string name="menu_clear">Počisti</string>
|
||||||
|
<string name="status_service_create">Storitev zagnana</string>
|
||||||
|
<string name="status_service_destroy">Storitev ustavljena</string>
|
||||||
<string name="status_send_success">Pošiljanje uspelo</string>
|
<string name="status_send_success">Pošiljanje uspelo</string>
|
||||||
<string name="status_send_fail">Pošiljanje spodletelo</string>
|
<string name="status_send_fail">Pošiljanje spodletelo</string>
|
||||||
|
<string name="status_location_update">Posodobitev lokacije</string>
|
||||||
|
<string name="status_network_online">Mrežna povezava vzpostavljena</string>
|
||||||
|
<string name="status_network_offline">Ni mrežne povezave</string>
|
||||||
<string name="hidden_app_name">Nastavitve naprave</string>
|
<string name="hidden_app_name">Nastavitve naprave</string>
|
||||||
|
<string name="hidden_alert">Aplikacija je bila skrita. Za njen ponoven prikaz pokličite telefonsko številko 8722227 (TRACCAR).</string>
|
||||||
|
<string name="error_msg_invalid_url">Prosim vpišite veljaven http:// ali https:// naslov</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -20,27 +20,34 @@
|
|||||||
<string name="settings_status_on">Stop</string>
|
<string name="settings_status_on">Stop</string>
|
||||||
<string name="settings_status_off_summary">Servis zaustavljen</string>
|
<string name="settings_status_off_summary">Servis zaustavljen</string>
|
||||||
<string name="settings_status_on_summary">Servis pokrenut</string>
|
<string name="settings_status_on_summary">Servis pokrenut</string>
|
||||||
<string name="settings_provider_title">Provajder lokacije</string>
|
<string name="settings_buffer">Offline buffering</string>
|
||||||
<string name="settings_provider_summary">Izvor lokacijskih podataka</string>
|
<string name="settings_buffer_off_summary">Buffering uključen</string>
|
||||||
<string name="settings_provider_gps">GPS provajder</string>
|
<string name="settings_buffer_on_summary">Buffering isključen</string>
|
||||||
<string name="settings_provider_network">Provajder Mreže</string>
|
<string name="settings_wakelock">Zaključavanje budnosti</string>
|
||||||
<string name="settings_provider_mixed">Oba zajedno provajdera</string>
|
<string name="settings_wakelock_off_summary">Budnost isključena</string>
|
||||||
|
<string name="settings_wakelock_on_summary">Budnost uključena</string>
|
||||||
|
<string name="settings_accuracy_title">Tačnost lokacije</string>
|
||||||
|
<string name="settings_accuracy_summary">Željena tačnost lokacije</string>
|
||||||
|
<string name="settings_accuracy_high">Visoka</string>
|
||||||
|
<string name="settings_accuracy_medium">Srednja</string>
|
||||||
|
<string name="settings_accuracy_low">Mala</string>
|
||||||
<string name="settings_foreground_title">Prvi plan servis</string>
|
<string name="settings_foreground_title">Prvi plan servis</string>
|
||||||
<string name="settings_foreground_summary">Povecanje usluga prioritet</string>
|
<string name="settings_foreground_summary">Povecanje usluga prioritet</string>
|
||||||
<string name="menu_status">Status</string>
|
<string name="menu_status">Status</string>
|
||||||
<string name="menu_about">O klijentu</string>
|
<string name="menu_info">Info</string>
|
||||||
<string name="menu_shortcuts">Dodaj prečice</string>
|
<string name="menu_shortcuts">Dodaj prečice</string>
|
||||||
<string name="menu_clear">Očisti</string>
|
<string name="menu_clear">Očisti</string>
|
||||||
<string name="about_description">GPS tracker za Android telefone. GPS satelit kompatibilno.</string>
|
|
||||||
<string name="about_license">Ova aplikacija je besplatna i open source,izvorni kod je licenciran pod Apache License Version 2.0 i dostupan na GitHub</string>
|
|
||||||
<string name="about_web">Za više informacija www.traccar.org/client </string>
|
|
||||||
<string name="status_service_create">Servis pokrenut</string>
|
<string name="status_service_create">Servis pokrenut</string>
|
||||||
<string name="status_service_destroy">Servis zaustavljen</string>
|
<string name="status_service_destroy">Servis zaustavljen</string>
|
||||||
<string name="status_send_success">Slanne uspešno</string>
|
<string name="status_send_success">Slanje uspešno</string>
|
||||||
<string name="status_send_fail">Slanje neuspešno</string>
|
<string name="status_send_fail">Slanje neuspešno</string>
|
||||||
<string name="status_location_update">Ažuriranje lokacije</string>
|
<string name="status_location_update">Ažuriranje lokacije</string>
|
||||||
<string name="status_connectivity_change">Promenjena konekcija</string>
|
<string name="status_network_online">Mreža dostupna</string>
|
||||||
|
<string name="status_network_offline">Mreža nedostupna</string>
|
||||||
<string name="hidden_app_name">Podešavanja uređaja</string>
|
<string name="hidden_app_name">Podešavanja uređaja</string>
|
||||||
<string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string>
|
<string name="hidden_alert">Aplikacija je skrivena. Da je otvorite kucajte 8722227 (TRACCAR).</string>
|
||||||
<string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string>
|
<string name="error_msg_invalid_url">Molimo unesite pravilnu http:// ili https:// adresu</string>
|
||||||
|
<string name="request_exception">Da biste kontinuirano prikupljali podatke o lokaciji, isključite optimizaciju baterije za aplikaciju.</string>
|
||||||
|
<string name="request_background">Da biste kontinuirano prikupljali podatke o lokaciji, omogućite %s dozvolu.</string>
|
||||||
|
<string name="request_background_option">Dozvoljeno svo vreme</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Ссылка в новой задаче
Block a user