diff --git a/app/build.gradle b/app/build.gradle
index 10a42ac..aa3d07c 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -193,6 +193,9 @@ dependencies {
// implementation 'com.google.android.material:material:1.10.0'
// implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
+ implementation 'androidx.appcompat:appcompat:1.6.1'
+ implementation 'com.google.android.material:material:1.10.0'
+ implementation 'androidx.activity:activity:1.8.0'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 004501c..301cf8f 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -38,6 +38,7 @@
+
@@ -85,8 +86,7 @@
android:name="android.permission.BLUETOOTH_SCAN"
android:usesPermissionFlags="neverForLocation"
tools:targetApi="s" />
-
-
+
@@ -105,6 +105,9 @@
android:usesCleartextTraffic="true"
tools:replace="android:supportsRtl"
tools:targetApi="n">
+
+ val bgColor = if (TextUtils.isEmpty(item.bottomBgColor)) {
+ ContextCompat.getColor(mContext, R.color.tracker_manage_bg_color)
+ } else {
+ item.bottomBgColor.toColorInt()
+ }
+ drawable.setBgData(ColorStateList.valueOf(bgColor))
+ }
+ }
+
+ getTextView(R.id.tv_choose_plan_item_power).let {
+ it.visibility = if (item.list.isNullOrEmpty()) View.GONE
+ else {
+ var str = getManyLanguageLimitDec(item.listTitleCode)
+ if (TextUtils.isEmpty(str)) {
+ for (i in 0 until item.list!!.size) {
+ val packageDec = item.list!![i]
+ str += "${i + 1}.${packageDec.title}"
+ if (i != item.list!!.size - 1) {
+ str += "\n"
+ }
+ }
+ }
+ it.text = str
+ View.VISIBLE
+ }
+ }
+ }
+ }
+
+ private fun getManyLanguageLimitDec(nameCode: Int): String {
+ return when (nameCode) {
+ ConstantInt.Type1 -> mContext.getString(R.string.txt_package_permission1)
+ ConstantInt.Type2 -> mContext.getString(R.string.txt_package_permission2)
+ ConstantInt.Type3 -> mContext.getString(R.string.txt_package_permission3)
+ else -> ""
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/abbidot/tracker/bean/PackageBean.kt b/app/src/main/java/com/abbidot/tracker/bean/PackageBean.kt
index 46bafcb..af11f96 100644
--- a/app/src/main/java/com/abbidot/tracker/bean/PackageBean.kt
+++ b/app/src/main/java/com/abbidot/tracker/bean/PackageBean.kt
@@ -24,5 +24,9 @@ data class PackageBean(
var planTimeMonthsCount: Int,
var everyMonthSafeFee: Double,
var billedMode: String,
- var selected: Boolean
+ var selected: Boolean,
+ var bottomBgColor: String,
+ var listTitleCode: Int,
+ var planNameCode: Int,
+ var list: MutableList?
) : Parcelable
diff --git a/app/src/main/java/com/abbidot/tracker/bean/PackageBenefitsBean.kt b/app/src/main/java/com/abbidot/tracker/bean/PackageBenefitsBean.kt
index 52fd07f..202725d 100644
--- a/app/src/main/java/com/abbidot/tracker/bean/PackageBenefitsBean.kt
+++ b/app/src/main/java/com/abbidot/tracker/bean/PackageBenefitsBean.kt
@@ -1,8 +1,12 @@
package com.abbidot.tracker.bean
+import android.os.Parcelable
+import kotlinx.parcelize.Parcelize
+
/**
*Created by .yzq on 2024/9/5/005.
* @link
* @description:
*/
-data class PackageBenefitsBean(var title: String, var status: Int, var titleCode: Int)
+@Parcelize
+data class PackageBenefitsBean(var title: String, var status: Int, var titleCode: Int) : Parcelable
diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/account/UserProfileActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/account/UserProfileActivity.kt
index 495d828..3f926f8 100644
--- a/app/src/main/java/com/abbidot/tracker/ui/activity/account/UserProfileActivity.kt
+++ b/app/src/main/java/com/abbidot/tracker/ui/activity/account/UserProfileActivity.kt
@@ -98,11 +98,9 @@ class UserProfileActivity :
ilUserProfileEmailLayout.ivInputRepresentImage
)
- mUploadImageUrl = MMKVUtil.getString(MMKVKey.HeadUrl)
+// mUploadImageUrl = MMKVUtil.getString(MMKVKey.HeadUrl)
ViewUtil.instance.imageLoadUrl(
- ilUserProfileHeadLayout.ilPetProfileHead.appHeadImage,
- mUploadImageUrl,
- R.drawable.pic_avatar_df
+ ilUserProfileHeadLayout.ilPetProfileHead.appHeadImage, "", R.drawable.pic_avatar_df
)
}
diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/device/InitializingDeviceActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/device/InitializingDeviceActivity.kt
new file mode 100644
index 0000000..856fd35
--- /dev/null
+++ b/app/src/main/java/com/abbidot/tracker/ui/activity/device/InitializingDeviceActivity.kt
@@ -0,0 +1,52 @@
+package com.abbidot.tracker.ui.activity.device
+
+import android.content.Intent
+import com.abbidot.tracker.R
+import com.abbidot.tracker.base.BaseActivity
+import com.abbidot.tracker.bean.PetBean
+import com.abbidot.tracker.constant.ConstantInt
+import com.abbidot.tracker.constant.ConstantString
+import com.abbidot.tracker.databinding.ActivityInitializingDeviceBinding
+import com.abbidot.tracker.ui.activity.device.wifi.AddWifiPowerZone1Activity
+import com.abbidot.tracker.util.Util
+
+class InitializingDeviceActivity :
+ BaseActivity(ActivityInitializingDeviceBinding::inflate) {
+
+ private var mPetBean: PetBean? = null
+ private var isFirstBind = false
+ private var mDeviceType = ConstantInt.Type1
+
+ override fun getTopBar() = null
+
+ override fun initData() {
+ super.initData()
+
+ intent.extras?.apply {
+ isFirstBind = getBoolean(ConstantString.isFirstBind, false)
+ mPetBean = Util.getParcelableAdaptive(intent, ConstantString.Pet, PetBean::class.java)
+ mDeviceType = getInt(ConstantString.Type, ConstantInt.Type1)
+ }
+
+ mViewBinding.apply {
+ val str = if (mDeviceType == ConstantInt.Type2) {
+ tvPaySuccessInitDeviceDec.setText(R.string.txt_init_g40_dec)
+ ivInitDeviceFlashImage.setImageResource(R.drawable.icon_init_g40_flash_image)
+ String.format(getString(R.string.txt_init_device_tip), "1-5")
+ } else String.format(getString(R.string.txt_init_device_tip), "15-20")
+ tvPaySuccessInitDeviceTip.text = str
+
+ btnPaySuccessInitDeviceNext.setOnClickListener {
+ val intent = Intent(mContext, AddWifiPowerZone1Activity::class.java)
+ intent.putExtra(ConstantString.Pet, mPetBean)
+ intent.putExtra(ConstantString.isFirstBind, isFirstBind)
+ startActivityFinish(intent)
+ }
+ }
+ }
+
+ override fun leftBackOnClick() {
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentSuccessActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentSuccessActivity.kt
index c015c49..c3f1b17 100644
--- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentSuccessActivity.kt
+++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentSuccessActivity.kt
@@ -25,7 +25,7 @@ import com.abbidot.tracker.constant.ConstantString
import com.abbidot.tracker.constant.GetResultCallback
import com.abbidot.tracker.databinding.ActivityPaymentSuccessBinding
import com.abbidot.tracker.deprecated.ui.activity.vm.AddTrackerDeviceViewModel
-import com.abbidot.tracker.ui.activity.device.wifi.AddWifiPowerZone1Activity
+import com.abbidot.tracker.ui.activity.device.InitializingDeviceActivity
import com.abbidot.tracker.util.Util
import com.abbidot.tracker.util.ViewUtil
import com.abbidot.tracker.util.bluetooth.SRBleCmdUtil
@@ -221,9 +221,12 @@ class PaymentSuccessActivity :
mViewBinding.root.postDelayed({
MMKVUtil.putInt(MMKVKey.isBindPet, ConstantInt.isBind)
mPetBean?.apply {
- val intent = Intent(mContext, AddWifiPowerZone1Activity::class.java)
+ val intent = Intent(mContext, InitializingDeviceActivity::class.java)
intent.putExtra(ConstantString.Pet, this)
intent.putExtra(ConstantString.isFirstBind, true)
+ mPayResult?.let { p ->
+ intent.putExtra(ConstantString.Type, p.deviceType)
+ }
startActivity(intent)
}
}, 1500)
diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/HomeMapGoogleMapFragmentV3.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/HomeMapGoogleMapFragmentV3.kt
index 178ca15..838b6c1 100644
--- a/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/HomeMapGoogleMapFragmentV3.kt
+++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/HomeMapGoogleMapFragmentV3.kt
@@ -113,11 +113,11 @@ class HomeMapGoogleMapFragmentV3 : BaseGoogleMapFragment() {
layout.tvPetLocationUpdateTimeFormat.visibility =
if (powerSwitch == ConstantInt.Type2) View.GONE
else {
- if (Util.isTimeoutReport(updateTime, gnssInterval)) {
+ if (Util.isTimeoutReport(latLonUpdateTime, gnssInterval)) {
layout.tvPetLocationUpdateTimeFormat.text = String.format(
getString(R.string.txt_location_ago),
Utils.getTimeDifference(
- updateTime * 1000, System.currentTimeMillis()
+ latLonUpdateTime * 1000, System.currentTimeMillis()
)
)
View.VISIBLE
diff --git a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt
index bcf24e6..fe010b3 100644
--- a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt
+++ b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt
@@ -48,6 +48,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import coil.load
+import coil.request.CachePolicy
import coil.transform.Transformation
import com.abbidot.baselibrary.constant.ConState
import com.abbidot.baselibrary.constant.MMKVKey
@@ -86,6 +87,7 @@ import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton
import com.qmuiteam.qmui.util.QMUIDisplayHelper
import com.qmuiteam.qmui.widget.dialog.QMUIBottomSheet.BottomListSheetBuilder
import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView
+import okhttp3.internal.http2.Header
import java.util.Calendar
@@ -641,10 +643,19 @@ class ViewUtil private constructor() {
error(errorImageResId)
//淡入淡出的动画时间
// crossfade(2000)
-// memoryCachePolicy(CachePolicy.ENABLED)//设置内存的缓存策略
-// diskCachePolicy(CachePolicy.ENABLED)//设置磁盘的缓存策略
-// networkCachePolicy(CachePolicy.ENABLED)//设置网络的缓存策略
-// OkHttpClient.Builder().cache(CoilUtils.createDefaultCache(context))
+ diskCachePolicy(CachePolicy.ENABLED)//设置磁盘的缓存策略
+ memoryCachePolicy(CachePolicy.ENABLED)//设置内存的缓存策略
+ networkCachePolicy(CachePolicy.ENABLED)//设置网络的缓存策略
+// val okHttpCache = Cache(
+// context.cacheDir.resolve("okhttp_cache"), 50 * 1024 * 1024L
+// )
+// OkHttpClient.Builder().cache(okHttpCache)
+
+ // 请求优先 WebP 更小更快
+ Header("Accept", "image/webp,image/jpeg;q=0.8")
+ if (imageView.width > 0 && imageView.height > 0) {
+ size(imageView.width, imageView.height)// 按View实际大小解码
+ }
transformations(transformations.toList())
}
}
diff --git a/app/src/main/res/drawable-xhdpi/icon_init_device_dec_image.png b/app/src/main/res/drawable-xhdpi/icon_init_device_dec_image.png
new file mode 100644
index 0000000..052f582
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_init_device_dec_image.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_init_g30_flash_image.png b/app/src/main/res/drawable-xhdpi/icon_init_g30_flash_image.png
new file mode 100644
index 0000000..1236dfb
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_init_g30_flash_image.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_init_g40_flash_image.png b/app/src/main/res/drawable-xhdpi/icon_init_g40_flash_image.png
new file mode 100644
index 0000000..df4d4af
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_init_g40_flash_image.png differ
diff --git a/app/src/main/res/drawable-xhdpi/icon_popular_package_image.png b/app/src/main/res/drawable-xhdpi/icon_popular_package_image.png
new file mode 100644
index 0000000..5225f0a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_popular_package_image.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_init_device_dec_image.png b/app/src/main/res/drawable-xxhdpi/icon_init_device_dec_image.png
new file mode 100644
index 0000000..fe93d9c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_init_device_dec_image.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_init_g30_flash_image.png b/app/src/main/res/drawable-xxhdpi/icon_init_g30_flash_image.png
new file mode 100644
index 0000000..4b4a048
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_init_g30_flash_image.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_init_g40_flash_image.png b/app/src/main/res/drawable-xxhdpi/icon_init_g40_flash_image.png
new file mode 100644
index 0000000..813e53d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_init_g40_flash_image.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_popular_package_image.png b/app/src/main/res/drawable-xxhdpi/icon_popular_package_image.png
new file mode 100644
index 0000000..5325e07
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_popular_package_image.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/icon_init_device_dec_image.png b/app/src/main/res/drawable-xxxhdpi/icon_init_device_dec_image.png
new file mode 100644
index 0000000..823533c
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_init_device_dec_image.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/icon_init_g30_flash_image.png b/app/src/main/res/drawable-xxxhdpi/icon_init_g30_flash_image.png
new file mode 100644
index 0000000..78f65a0
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_init_g30_flash_image.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/icon_init_g40_flash_image.png b/app/src/main/res/drawable-xxxhdpi/icon_init_g40_flash_image.png
new file mode 100644
index 0000000..d7ca6d9
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_init_g40_flash_image.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/icon_popular_package_image.png b/app/src/main/res/drawable-xxxhdpi/icon_popular_package_image.png
new file mode 100644
index 0000000..41135e3
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/icon_popular_package_image.png differ
diff --git a/app/src/main/res/layout/activity_initializing_device.xml b/app/src/main/res/layout/activity_initializing_device.xml
new file mode 100644
index 0000000..70840a3
--- /dev/null
+++ b/app/src/main/res/layout/activity_initializing_device.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_choose_plan_layout.xml b/app/src/main/res/layout/item_choose_plan_layout.xml
index ca2d7b3..c326727 100644
--- a/app/src/main/res/layout/item_choose_plan_layout.xml
+++ b/app/src/main/res/layout/item_choose_plan_layout.xml
@@ -30,6 +30,7 @@
android:textSize="@dimen/textSize16"
android:textStyle="bold" />
+
-
+
+
-
+
+
+
+
+
+
+
+
+
-
@@ -112,7 +146,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/dp_16"
- android:visibility="gone"
app:cardBackgroundColor="@color/select_color2"
app:cardCornerRadius="@dimen/dp_50"
app:cardElevation="@dimen/dp_4">
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 79f83c3..92c89ee 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -979,6 +979,7 @@
espeichert. Aktiv, wenn online.
Verlängerung: $%s / %s Jahre am %s
Verlängerung: $%s / %s Monate am %s
+ Baidu Maps
Die Rückerstattungsfrist ist abgelaufen
Rückerstattungsrichtlinie\n
Automatische Rückerstattung (innerhalb von 48 Stunden)
@@ -988,5 +989,26 @@
Abonnements, die älter als 30 Tage sind, können nicht erstattet werden.
Keine Rückerstattung nach 30 Tagen
Gestrichelte Linie anzeigen
+ Erstmalige Verwendung
+ Tägliche Verwendung
+ Schlafmodus
+ 15 Minuten keine Bewegung → Schlafmodus. Automatisches Aufwachen bei Bewegung. Batterieaktualisierung alle 24 Stunden
+ WiFi-Zone (Zuhause)
+ Mit heimischem WLAN verbinden – GPS aus → spart Batterie. Aktualisierung ca. alle 60 Minuten
+ Haustier > Tracker > GPS-Update: 3–15 min wählen. Kurzes Intervall = höherer Batterieverbrauch. Standard: 5 min
+ Zaun-Typ festlegen
+ Sicherer Bereich oder Verbotsbereich
+ Grenze festlegen
+ Alarme aktivieren in: Konto > Einstellungen > Benachrichtigungen
+ Zaun bearbeiten oder löschen unter „Verwalten“
+ Gesamt
+ (Vor %s)
+ Die Erstinstallation kann %s Minuten dauern
+ 1. Gehen Sie mit dem Gerät nach draußen\n2. Warten Sie auf LTE- und GPS-Verbindung\n3. Blaues Blinken = LTE und GPS aktiv
+ 1. Gehen Sie mit dem Gerät nach draußen\n2. Warten Sie auf LTE- und GPS-Verbindung\n3. Grünes Blinken = LTE und GPS aktiv
+ Gerät wird initialisiert
+ 1. Flexibler kurzfristiger Schutz\n2.Standard-Kundensupport
+ 1.1 Geräteaustausch inbegriffen\n2. Dedizierter Kundensupport\n3. Jährlicher Schutzumfang
+ 1. VIP-Prioritätssupport\n2. Schneller Austauschservice (1x inbegriffen)\n3. Erweiterter Schutz\n4. Sorgenfreier Haustierschutz
\ No newline at end of file
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index b88209e..3f97cf8 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -1023,6 +1023,7 @@
已保存,上线时生效。
续订:$%s / %s 年,于 %s
续订:$%s / %s 月,于 %s
+ 百度地图
退款期限已过
退款政策\n
自动退款(48小时内)
@@ -1032,5 +1033,27 @@
超过30天的订阅不可退款。
30天后不退款
显示虚线
+ 首次使用
+ 日常使用
+ 休眠模式
+ 15分钟无移动 → 进入休眠模式。移动时自动唤醒。电量每24小时更新一次
+ WiFi区域(家)
+ 连接家庭WiFi → GPS关闭 → 节省电池。约每60分钟更新一次
+ 宠物 > 追踪器 > GPS更新:选择3–15分钟。间隔越短,耗电越高。默认:5分钟
+ 设置围栏类型
+ 安全区域 或 禁区
+ 设置边界
+ 在“账户 > 设置 > 通知”中启用提醒
+ 在“管理”中编辑或删除围栏
+ 总计
+ (%s前)
+ 初始化设置可能需要 %s 分钟
+ 1. 携带设备到户外\n2. 等待 LTE 和 GPS 连接\n3. 蓝色闪烁 = LTE 和 GPS 已激活
+ 1. 携带设备到户外\n2. 等待 LTE 和 GPS 连接\n3. 绿色闪烁 = LTE 和 GPS 已激活
+ 正在初始化设备
+ 1. 灵活的短期保障\n2. 标准客户支持
+ 1.设备1次更换\n2. 专属客户支持\n3. 年度保障服务
+ 1. VIP 优先支持\n2. 快速更换服务(含1次)\n3. 增强型保障\n4. 无忧宠物保护
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 7a6356a..5b7abc4 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -380,4 +380,5 @@
#B0B0B0
#758E94
#FF996E
+ #FEF6E4
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1cc364a..250c2bd 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1037,7 +1037,7 @@
Geofencing
Route History Records
Family Members Sharing
- Premium Customer Support
+ 30-days return guarantee
The program has an exception and is about to exit
Activate Subscription
Powered off
@@ -1081,7 +1081,7 @@
Saved. Active when online.
Renewal: $%s/%s years on %s
Renewal: $%s/%s months on %s
- Baidu Map
+ Baidu Maps
Refund period has expired
Refund Policy\n
Automatic Refund (Within 48 Hours)
@@ -1105,5 +1105,12 @@
Edit or delete fence in Manage
Total
(%s ago)
+ Initial setup may take %s minutes
+ 1. Move outdoors with device\n2. Wait for LTE & GPS connection\n3. Blue flashing = LTE & GPS active
+ 1. Move outdoors with device\n2. Wait for LTE & GPS connection\n3. Green flashing = LTE & GPS active
+ Initializing Device
+ 1.Flexible short-term protection\n2.Standard customer support
+ 1.1 device replacement included\n2.Dedicated customer support\n3.Annual protection coverage
+ 1.VIP priority support\n2.Fast replacement service (1 included)\n3.Enhanced protection\n4.Hassle-free pet protection
\ No newline at end of file