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