From 1a032383cecc6ec53a03612d8e204ef42546eaa1 Mon Sep 17 00:00:00 2001 From: yezhiqiu <123456@qq.com> Date: Wed, 9 Sep 2026 10:57:31 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9E=E5=88=A0=E9=99=A4=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=94=AF=E4=BB=98=E4=BF=A1=E6=81=AF=E5=B9=B6=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E8=AE=A2=E9=98=85=202.=E5=AE=8C=E5=96=84=E6=84=8F?= =?UTF-8?q?=E5=A4=A7=E5=88=A9=E8=AF=AD=E8=A8=80=203.=E5=88=A0=E9=99=A4Room?= =?UTF-8?q?=20=E6=95=B0=E6=8D=AE=E5=BA=93=EF=BC=8C=E8=A7=A3=E5=86=B3C-05?= =?UTF-8?q?=20-=20=E6=95=8F=E6=84=9F=E4=BD=8D=E7=BD=AE=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=BB=A5=E6=98=8E=E6=96=87=E5=AD=98=E5=82=A8=E5=9C=A8=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=204.=E4=BC=98=E5=8C=96=E9=80=9A=E7=94=A8=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=EF=BC=8C=E5=9B=BA=E5=AE=9A=E9=AB=98=E5=BA=A6=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E8=87=AA=E9=80=82=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../compile-file-map.properties | 2 +- app/build.gradle | 6 +- app/src/main/assets/privacy_it.html | 71 ++ .../subscription_terms_conditions_it.html | 54 + app/src/main/assets/terms_it.html | 76 ++ .../com/abbidot/tracker/base/BaseDialog.kt | 20 +- .../abbidot/tracker/bean/CreditCardBean.kt | 31 +- .../com/abbidot/tracker/bean/DeviceBean.kt | 40 +- .../com/abbidot/tracker/bean/OrderBean.kt | 2 +- .../abbidot/tracker/database/MyDatabase.kt | 31 +- .../tracker/database/dao/CreditCardDao.kt | 3 +- .../abbidot/tracker/database/dao/DeviceDao.kt | 9 +- .../recharge/PaymentMethodPayPalActivity.kt | 9 +- .../recharge/PaymentMethodStripeActivity.kt | 5 +- .../ui/activity/vm/BraintreePalViewModel.kt | 119 +- .../ui/activity/vm/StripePalViewModel.kt | 34 +- .../abbidot/tracker/dialog/MyAlertDialog.kt | 6 +- .../tracker/retrofit2/INetworkService.kt | 17 + .../abbidot/tracker/retrofit2/NetworkApi.kt | 24 +- .../tracker/ui/activity/HomeV2Activity.kt | 18 - .../activity/device/DeleteTracker1Activity.kt | 6 - .../activity/device/DeleteTracker2Activity.kt | 7 - .../ui/activity/device/MyTrackerV2Activity.kt | 15 - .../subscribe/AddCreditCardPaymentActivity.kt | 141 +-- .../subscribe/PaymentMethodActivity.kt | 94 +- .../subscribe/CreditCardPaymentFragment.kt | 18 +- .../subscribe/PaypalPaymentFragment.kt | 11 +- .../java/com/abbidot/tracker/util/Util.kt | 4 - .../java/com/abbidot/tracker/util/ViewUtil.kt | 2 +- .../tracker/vm/ConnectionDeviceViewModel.kt | 86 -- .../tracker/vm/SubscriptionPayViewModel.kt | 26 + app/src/main/res/layout/dialog_my_layout.xml | 92 +- .../layout/fragment_credit_card_payment.xml | 39 +- .../res/layout/fragment_paypal_payment.xml | 18 +- app/src/main/res/values-de/strings.xml | 8 + app/src/main/res/values-fr/strings.xml | 7 + app/src/main/res/values-it/strings.xml | 1007 +++++++++-------- app/src/main/res/values-zh-rCN/strings.xml | 6 + app/src/main/res/values/strings.xml | 6 + .../com/abbidot/baselibrary/util/AppUtils.kt | 2 +- 40 files changed, 1158 insertions(+), 1014 deletions(-) create mode 100644 app/src/main/assets/privacy_it.html create mode 100644 app/src/main/assets/subscription_terms_conditions_it.html create mode 100644 app/src/main/assets/terms_it.html diff --git a/FastBleLib/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties b/FastBleLib/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties index 38c4cd6..31b5784 100644 --- a/FastBleLib/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +++ b/FastBleLib/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties @@ -1 +1 @@ -#Fri Aug 07 11:10:38 CST 2026 +#Tue Sep 08 18:11:01 CST 2026 diff --git a/app/build.gradle b/app/build.gradle index 3ca1ec3..338729a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -28,9 +28,9 @@ android { applicationId "com.abbidot.tracker" minSdkVersion 24 targetSdkVersion 35 - versionCode 2500 -// versionName "2.5.0" - versionName "2.5.0-Beta5" + versionCode 2501 + versionName "2.5.1" +// versionName "2.5.1-Beta1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/assets/privacy_it.html b/app/src/main/assets/privacy_it.html new file mode 100644 index 0000000..1663ed4 --- /dev/null +++ b/app/src/main/assets/privacy_it.html @@ -0,0 +1,71 @@ + + +
+

Presso ABBI PET INC rispettiamo la tua privacy e ci impegniamo a proteggerla. La presente Informativa sulla privacy descrive come raccogliamo, utilizziamo, tuteliamo e manteniamo riservate le tue informazioni quando utilizzi la nostra applicazione mobile («App»).

+ +

1. Informazioni che raccogliamo

+ + + +

2. Come utilizziamo le tue informazioni

+ + + +

3. Riservatezza e sicurezza dei dati

+ +

4. Condivisione delle tue informazioni

+ + +

5. Le tue scelte

+ + + +

6. Sicurezza

+ +

Adottiamo misure ragionevoli per proteggere le tue informazioni da accessi, utilizzi o divulgazioni non autorizzati. Tuttavia, nessun metodo di trasmissione su Internet o di archiviazione elettronica è sicuro al 100%.

+ +

7. Privacy dei minori

+ +

La nostra App non è destinata all'uso da parte di minori di età inferiore a 13 anni e non raccogliamo consapevolmente informazioni personali da minori di età inferiore a 13 anni. Qualora venissimo a conoscenza di aver raccolto informazioni personali da un minore di età inferiore a 13 anni, adotteremo le misure necessarie per eliminare tali informazioni.

+ +

8. Modifiche alla presente Informativa sulla privacy

+ +

Potremmo aggiornare di tanto in tanto la presente Informativa sulla privacy. Ti informeremo di eventuali modifiche pubblicando la nuova Informativa sulla privacy all'interno dell'App. Ti consigliamo di consultare periodicamente la presente Informativa per verificare eventuali modifiche.

+ +

9. Contattaci

+

Per qualsiasi domanda relativa alla presente Informativa sulla privacy, ti preghiamo di contattarci all'indirizzo:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-mail: support@abbidot.com

+ +
+ + + + + diff --git a/app/src/main/assets/subscription_terms_conditions_it.html b/app/src/main/assets/subscription_terms_conditions_it.html new file mode 100644 index 0000000..a307360 --- /dev/null +++ b/app/src/main/assets/subscription_terms_conditions_it.html @@ -0,0 +1,54 @@ + + +
+ +

Termini e condizioni di abbonamento al tracker ABBIDOT

+
+

1. Piani di abbonamento

+

ABBIDOT offre tre piani di abbonamento:

+ +

Tutti gli abbonamenti si rinnovano automaticamente alla fine di ogni ciclo di fatturazione, salvo annullamento da parte dell'utente.

+

Gli utenti possono annullare il proprio abbonamento in qualsiasi momento. Dopo l'annullamento, l'abbonamento rimarrà attivo fino alla fine del periodo di fatturazione corrente e non verranno applicati ulteriori addebiti.

+

Il dispositivo continuerà a funzionare normalmente durante il periodo di abbonamento attivo.

+
+

2. Politica di rimborso

+

2.1 Rimborso automatico (entro 48 ore)

+

Tutti gli acquisti di abbonamenti hanno diritto a un rimborso automatico completo entro 48 ore dal pagamento. I rimborsi verranno elaborati automaticamente, senza revisione manuale.

+
+

2.2 Periodo standard di rimborso (30 giorni)

+

Trascorse le iniziali 48 ore, gli utenti possono richiedere un rimborso entro 30 giorni dall'acquisto.

+ +
+

2.3 Nessun rimborso dopo 30 giorni

+

Gli abbonamenti con più di 30 giorni non sono rimborsabili.

+
+

3. Annullamento dell'abbonamento

+

Gli utenti possono annullare il proprio abbonamento in qualsiasi momento.

+ +
+

4. Aggiornamenti della politica

+

ABBIDOT si riserva il diritto di aggiornare o modificare i presenti Termini e condizioni in qualsiasi momento. Gli utenti verranno informati in caso di modifiche significative.

+

Abbonandoti ai servizi ABBIDOT, accetti i presenti termini.

+
+

5. Assistenza ai clienti

+

Qualora incontrassi difficoltà, ti preghiamo di contattarci all'indirizzo:

+

subscription@abbidot.com

+

Il nostro team di assistenza ti aiuterà al più presto possibile.

+
+ + + + + diff --git a/app/src/main/assets/terms_it.html b/app/src/main/assets/terms_it.html new file mode 100644 index 0000000..a8e32fe --- /dev/null +++ b/app/src/main/assets/terms_it.html @@ -0,0 +1,76 @@ + + + +
+

1. Accettazione dei termini

+ +

Scaricando, installando e utilizzando l'applicazione mobile ABBIDOT («App»), accetti di essere vincolato ai presenti Termini e condizioni («Termini»). Se non accetti i presenti Termini, non utilizzare l'App.

+ + + +

2. Utilizzo dell'App

+ + + + + +

3. Account e sicurezza

+ +

4. Privacy

+ +

L'utilizzo dell'App è inoltre disciplinato dalla nostra Informativa sulla privacy, che è incorporata per riferimento nei presenti Termini. Ti invitiamo a consultare la nostra Informativa sulla privacy per conoscere le nostre pratiche in materia di trattamento delle tue informazioni.

+ +

5. Contenuti dell'utente

+ + +

6. Proprietà intellettuale

+ +

Tutti i contenuti, le funzionalità e le caratteristiche dell'App, inclusi ma non limitati a testi, grafica, loghi e software, sono di proprietà esclusiva di ABBI PET INC o dei suoi licenzianti e sono protetti dalle normative in materia di diritto d'autore, marchi e altri diritti di proprietà intellettuale.

+ +

7. Risoluzione

+ +

ABBI PET INC può interrompere o sospendere il tuo accesso all'App in qualsiasi momento, senza preavviso e senza alcuna responsabilità, per qualsiasi motivo, incluso il caso di violazione dei presenti Termini. In caso di risoluzione, il tuo diritto di utilizzare l'App cesserà immediatamente.

+ +

8. Esclusioni di responsabilità e limitazione della responsabilità

+ + +

9. Legge applicabile

+

I presenti Termini saranno disciplinati e interpretati in conformità alle leggi dello Stato del Texas, senza tener conto dei principi in materia di conflitti di leggi.

+ +

10. Modifiche ai Termini

+

ABBI PET INC si riserva il diritto di modificare i presenti Termini in qualsiasi momento. Ti informeremo di eventuali modifiche pubblicando i nuovi Termini all'interno dell'App. Il continuo utilizzo dell'App dopo l'entrata in vigore delle modifiche costituisce accettazione dei nuovi Termini.

+ +

11. Riservatezza dei dati

+

Ci impegniamo a garantire la riservatezza dei tuoi dati. A tal fine adottiamo le seguenti misure di protezione dei dati:

+ + +

12. Contattaci

+

Per qualsiasi domanda relativa ai presenti Termini, ti preghiamo di contattarci all'indirizzo:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-mail: support@abbidot.com

+ + +
diff --git a/app/src/main/java/com/abbidot/tracker/base/BaseDialog.kt b/app/src/main/java/com/abbidot/tracker/base/BaseDialog.kt index 8526aa7..ad725d7 100644 --- a/app/src/main/java/com/abbidot/tracker/base/BaseDialog.kt +++ b/app/src/main/java/com/abbidot/tracker/base/BaseDialog.kt @@ -5,11 +5,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.View.OnClickListener -import android.view.WindowManager import androidx.annotation.StyleRes import androidx.appcompat.app.AppCompatDialog import androidx.viewbinding.ViewBinding -import com.abbidot.baselibrary.util.AppUtils import com.abbidot.tracker.R import com.qmuiteam.qmui.alpha.QMUIAlphaButton import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton @@ -18,7 +16,6 @@ import com.qmuiteam.qmui.alpha.QMUIAlphaImageButton /** *Created by .yzq on 2022/1/11/011.- * @link - * @dialogHeightDp 默认高度350dp * @description:BaseDialog */ abstract class BaseDialog @@ -44,15 +41,14 @@ abstract class BaseDialog //设置Dialog动画 window!!.setWindowAnimations(mAnimationResId) //设置弹窗的高度 - val layoutParams: WindowManager.LayoutParams = window!!.attributes - if (mDialogHeightDp == 0) { - //采用自适应高度 - layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT - } else { - layoutParams.height = AppUtils.dpToPx(mDialogHeightDp) - } -// layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT - window!!.attributes = layoutParams +// val layoutParams: WindowManager.LayoutParams = window!!.attributes +// if (mDialogHeightDp == 0) { +// //采用自适应高度 +// layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT +// } else { +// layoutParams.height = AppUtils.dpToPx(mDialogHeightDp) +// } +// window!!.attributes = layoutParams initView() } diff --git a/app/src/main/java/com/abbidot/tracker/bean/CreditCardBean.kt b/app/src/main/java/com/abbidot/tracker/bean/CreditCardBean.kt index db57a06..d9c8333 100644 --- a/app/src/main/java/com/abbidot/tracker/bean/CreditCardBean.kt +++ b/app/src/main/java/com/abbidot/tracker/bean/CreditCardBean.kt @@ -1,11 +1,6 @@ package com.abbidot.tracker.bean import android.os.Parcelable -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.PrimaryKey -import com.abbidot.tracker.database.MyDatabase import kotlinx.parcelize.Parcelize /** @@ -14,20 +9,20 @@ import kotlinx.parcelize.Parcelize * @description:保存用户输入信用卡 */ @Parcelize -@Entity(tableName = MyDatabase.CREDIT_CARD_TABLE) +//@Entity(tableName = MyDatabase.CREDIT_CARD_TABLE) data class CreditCardBean( - @PrimaryKey @ColumnInfo var cardNumber: String, - @ColumnInfo var firstName: String, - @ColumnInfo var lastName: String, - @ColumnInfo var cardName: String, - @ColumnInfo var expirationDate: String, - @ColumnInfo var cvv: String,//信用卡验证值(Card Verification Value) - @ColumnInfo var countryCode: String, - @ColumnInfo var isPrimary: Boolean, - @Ignore var checked: Boolean = false, - @Ignore var expMonth: Int, - @Ignore var expYear: Int, - @Ignore var lastFourNumber: String, + var cardNumber: String, + var firstName: String, + var lastName: String, + var cardName: String, + var expirationDate: String, + var cvv: String,//信用卡验证值(Card Verification Value) + var countryCode: String, + var isPrimary: Boolean, + var checked: Boolean = false, + var expMonth: Int, + var expYear: Int, + var lastFourNumber: String, ) : Parcelable { constructor() : this("", "", "", "", "", "", "USA", false, false, 0, 0, "") } diff --git a/app/src/main/java/com/abbidot/tracker/bean/DeviceBean.kt b/app/src/main/java/com/abbidot/tracker/bean/DeviceBean.kt index 7855437..d356864 100644 --- a/app/src/main/java/com/abbidot/tracker/bean/DeviceBean.kt +++ b/app/src/main/java/com/abbidot/tracker/bean/DeviceBean.kt @@ -1,13 +1,9 @@ package com.abbidot.tracker.bean import android.os.Parcelable -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore import com.abbidot.baselibrary.constant.ConState import com.abbidot.baselibrary.constant.DeviceType import com.abbidot.tracker.base.BaseDiffBean -import com.abbidot.tracker.database.MyDatabase import kotlinx.parcelize.Parcelize /** @@ -16,26 +12,26 @@ import kotlinx.parcelize.Parcelize * @description:连接保存的设备表 */ // 定义表名称,SQLite 中的表名称不区分大小写,2个主键 -@Entity(tableName = MyDatabase.DEVICE_TABLE, primaryKeys = ["deviceOutId", "deviceId"]) +//@Entity(tableName = MyDatabase.DEVICE_TABLE, primaryKeys = ["deviceOutId", "deviceId"]) @Parcelize data class DeviceBean(//@PrimaryKey(autoGenerate = true) var id: Long,//autoGenerate = true 自动增长分配ID - @ColumnInfo @DeviceType var type: Int,//设备类型 - @ColumnInfo var deviceName: String, - @ColumnInfo var deviceOutId: String, - @ColumnInfo var deviceId: String, - @ColumnInfo var shared: Int, //0=没有分享,1=是授权分享的 - @ColumnInfo var batteryCapacity: Int, - @ColumnInfo var ledSwitch: Int, - @ColumnInfo @ConState var conState: Int,//连接状态 - @ColumnInfo var macId: String, - @ColumnInfo var deviceInfoId: String, - @ColumnInfo var surplusDays: Int, - @ColumnInfo var gnssSignal: Int, - @ColumnInfo var lteSignal: Int, - @ColumnInfo var turnOff: Int, - @ColumnInfo var lightMode: Int, - @Ignore var deviceType: Int, - @Ignore var pet: PetBean? + var type: Int,//设备类型 + var deviceName: String, + var deviceOutId: String, + var deviceId: String, + var shared: Int, //0=没有分享,1=是授权分享的 + var batteryCapacity: Int, + var ledSwitch: Int, + var conState: Int,//连接状态 + var macId: String, + var deviceInfoId: String, + var surplusDays: Int, + var gnssSignal: Int, + var lteSignal: Int, + var turnOff: Int, + var lightMode: Int, + var deviceType: Int, + var pet: PetBean? ) : BaseDiffBean(), Parcelable { // 如果某个实体中有您不想保留的字段,则可以使用 @Ignore 为这些字段添加注释 diff --git a/app/src/main/java/com/abbidot/tracker/bean/OrderBean.kt b/app/src/main/java/com/abbidot/tracker/bean/OrderBean.kt index 71d1718..5f10432 100644 --- a/app/src/main/java/com/abbidot/tracker/bean/OrderBean.kt +++ b/app/src/main/java/com/abbidot/tracker/bean/OrderBean.kt @@ -8,5 +8,5 @@ package com.abbidot.tracker.bean */ data class OrderBean( var orderId: String, var orderNo: String, var availableOrder: Int,//判断套餐是否可用或过期,1是可用 0不可用 - var isCanRefund: Int + var isCanRefund: Int, var isNeedCancel: Int//是否需要取消订阅 0:不存在 1存在 ) \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/database/MyDatabase.kt b/app/src/main/java/com/abbidot/tracker/database/MyDatabase.kt index 5f9d853..18f23d1 100644 --- a/app/src/main/java/com/abbidot/tracker/database/MyDatabase.kt +++ b/app/src/main/java/com/abbidot/tracker/database/MyDatabase.kt @@ -1,13 +1,8 @@ package com.abbidot.tracker.database -import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase import com.abbidot.tracker.MyApplication -import com.abbidot.tracker.bean.CreditCardBean -import com.abbidot.tracker.bean.DeviceBean -import com.abbidot.tracker.database.dao.CreditCardDao -import com.abbidot.tracker.database.dao.DeviceDao /** *Created by .yzq on 2021/11/6/006. @@ -15,15 +10,14 @@ import com.abbidot.tracker.database.dao.DeviceDao * @description:RoomDatabase实例 */ //exportSchema = false,防止改数据库内容版本自动增加 -@Database( - entities = [DeviceBean::class, CreditCardBean::class], - version = 5, -// autoMigrations = [AutoMigration(from = 1, to = 2)], - exportSchema = false, -) +//@Database( +// entities = [DeviceBean::class, CreditCardBean::class], +// version = 5, +//// autoMigrations = [AutoMigration(from = 1, to = 2)], +// exportSchema = false, +//) abstract class MyDatabase : RoomDatabase() { - abstract fun deviceDao(): DeviceDao - abstract fun creditCardDao(): CreditCardDao +// abstract fun creditCardDao(): CreditCardDao companion object { @@ -47,14 +41,9 @@ abstract class MyDatabase : RoomDatabase() { //表名 const val CREDIT_CARD_TABLE = "creditCard" - const val DEVICE_TABLE = "device" - fun deviceDao(): DeviceDao { - return db.deviceDao() - } - - fun creditCardDao(): CreditCardDao { - return db.creditCardDao() - } +// fun creditCardDao(): CreditCardDao { +// return db.creditCardDao() +// } } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/database/dao/CreditCardDao.kt b/app/src/main/java/com/abbidot/tracker/database/dao/CreditCardDao.kt index 03131aa..6108345 100644 --- a/app/src/main/java/com/abbidot/tracker/database/dao/CreditCardDao.kt +++ b/app/src/main/java/com/abbidot/tracker/database/dao/CreditCardDao.kt @@ -1,6 +1,5 @@ package com.abbidot.tracker.database.dao -import androidx.room.Dao import com.abbidot.tracker.bean.CreditCardBean /** @@ -8,5 +7,5 @@ import com.abbidot.tracker.bean.CreditCardBean * @link * @description: */ -@Dao +//@Dao interface CreditCardDao : BaseDao \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/database/dao/DeviceDao.kt b/app/src/main/java/com/abbidot/tracker/database/dao/DeviceDao.kt index 3088025..9a1fd7d 100644 --- a/app/src/main/java/com/abbidot/tracker/database/dao/DeviceDao.kt +++ b/app/src/main/java/com/abbidot/tracker/database/dao/DeviceDao.kt @@ -1,18 +1,15 @@ package com.abbidot.tracker.database.dao -import androidx.room.Dao -import androidx.room.Query import com.abbidot.tracker.bean.DeviceBean -import com.abbidot.tracker.database.MyDatabase /** *Created by .yzq on 2021/11/8/008. * @link * @description:DeviceBean表的dao */ -@Dao +//@Dao interface DeviceDao : BaseDao { - @Query("SELECT * FROM ${MyDatabase.DEVICE_TABLE} WHERE macId LIKE :mac LIMIT 1") - fun findByMac(mac: String): DeviceBean? +// @Query("SELECT * FROM ${MyDatabase.DEVICE_TABLE} WHERE macId LIKE :mac LIMIT 1") +// fun findByMac(mac: String): DeviceBean? } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodPayPalActivity.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodPayPalActivity.kt index 631fbd6..8619079 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodPayPalActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodPayPalActivity.kt @@ -21,7 +21,6 @@ import com.abbidot.tracker.bean.SetMealBean import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.databinding.ActivitySelectPaymentMethodBinding import com.abbidot.tracker.deprecated.adapter.SelectPaymentMethodAdapter import com.abbidot.tracker.deprecated.ui.activity.vm.BraintreePalViewModel @@ -99,8 +98,8 @@ class PaymentMethodPayPalActivity : withContext(Dispatchers.IO) { ViewUtil.instance.addMenuBean(paymentMethodList, "", "", R.drawable.ico_lay_paypal) - val list = MyDatabase.creditCardDao().findAll(MyDatabase.CREDIT_CARD_TABLE) - list?.forEach { + val list = mutableListOf() + list.forEach { val imageId = Util.getCreditCardType(it.cardNumber) ViewUtil.instance.addMenuBean( paymentMethodList, it.cardNumber, it.expirationDate, imageId @@ -115,7 +114,7 @@ class PaymentMethodPayPalActivity : ) } - mSelectPaymentMethodAdapter = SelectPaymentMethodAdapter(mContext!!, paymentMethodList) + mSelectPaymentMethodAdapter = SelectPaymentMethodAdapter(mContext, paymentMethodList) mSelectPaymentMethodAdapter.setOnItemClickListener(object : BaseRecyclerAdapter.OnItemClickListener { override fun onItemClick(itemView: View?, pos: Int) { @@ -123,7 +122,7 @@ class PaymentMethodPayPalActivity : } }) ViewUtil.instance.setRecyclerViewVerticalLinearLayout( - mContext!!, + mContext, mViewBinding.paymentMethodRecyclerView, mSelectPaymentMethodAdapter, bottom = 40 diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodStripeActivity.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodStripeActivity.kt index 11effbb..8d36d91 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodStripeActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/profile/recharge/PaymentMethodStripeActivity.kt @@ -21,7 +21,6 @@ import com.abbidot.tracker.bean.RechargeDeviceBean import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.databinding.ActivitySelectPaymentMethodBinding import com.abbidot.tracker.deprecated.adapter.SelectPaymentMethodAdapter import com.abbidot.tracker.deprecated.ui.activity.vm.BraintreePalViewModel @@ -113,8 +112,8 @@ class PaymentMethodStripeActivity : withContext(Dispatchers.IO) { // ViewUtil.instance.addMenuBean(paymentMethodList, "", "", R.drawable.ico_lay_paypal) - val list = MyDatabase.creditCardDao().findAll(MyDatabase.CREDIT_CARD_TABLE) - list?.forEach { + val list = mutableListOf() + list.forEach { val imageId = Util.getCreditCardType(it.cardNumber) ViewUtil.instance.addMenuBean( paymentMethodList, it.cardNumber, it.expirationDate, imageId diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/BraintreePalViewModel.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/BraintreePalViewModel.kt index 693259e..7d15efb 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/BraintreePalViewModel.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/BraintreePalViewModel.kt @@ -11,7 +11,6 @@ import com.abbidot.baselibrary.util.MMKVUtil import com.abbidot.tracker.R import com.abbidot.tracker.base.BaseActivity import com.abbidot.tracker.bean.* -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.diff.PaymentMethodDiffCallBack import com.abbidot.tracker.retrofit2.NetworkApi import com.abbidot.tracker.util.Util @@ -59,9 +58,11 @@ class BraintreePalViewModel : ViewModel() { /** * 显示添加的信用卡 */ - fun addCreditCard(activity: BaseActivity<*>, - card: CreditCardBean, - adapter: BaseRecyclerAdapter) { + fun addCreditCard( + activity: BaseActivity<*>, + card: CreditCardBean, + adapter: BaseRecyclerAdapter + ) { val oldList = adapter.getData() val newList = mutableListOf() newList.addAll(oldList) @@ -76,12 +77,14 @@ class BraintreePalViewModel : ViewModel() { } } if (!isSame) { - newList.removeLast() +// newList.removeLast() val imageId = Util.getCreditCardType(card.cardNumber) ViewUtil.instance.addMenuBean(newList, card.cardNumber, card.expirationDate, imageId) - ViewUtil.instance.addMenuBean(newList, - activity.getString(R.string.txt_pay_order_add_card), "", - R.drawable.ico_lay_newcard) + ViewUtil.instance.addMenuBean( + newList, + activity.getString(R.string.txt_pay_order_add_card), "", + R.drawable.ico_lay_newcard + ) } viewModelScope.launch { @@ -116,11 +119,13 @@ class BraintreePalViewModel : ViewModel() { /** *@param orderStatus:0待支付 1是支付成功 2是取消支付/失败 */ - fun updateOrderStatus(activity: BaseActivity<*>, - orderId: String, - orderStatus: Int,//0待支付 1是支付成功 2是取消支付/失败 - deviceId: String, - mealDays: Int) { + fun updateOrderStatus( + activity: BaseActivity<*>, + orderId: String, + orderStatus: Int,//0待支付 1是支付成功 2是取消支付/失败 + deviceId: String, + mealDays: Int + ) { activity.showLoading(true) viewModelScope.launch { val result = NetworkApi.updateOrderStatus(orderId, orderStatus, deviceId, mealDays) @@ -131,12 +136,14 @@ class BraintreePalViewModel : ViewModel() { /** * 信用卡发起支付 */ - fun cardPayment(activity: BaseActivity<*>, - mealName: String, - mealDays: Int, - totalCost: String, - paymentMethodNonce: String, - deviceId: String) { + fun cardPayment( + activity: BaseActivity<*>, + mealName: String, + mealDays: Int, + totalCost: String, + paymentMethodNonce: String, + deviceId: String + ) { activity.showLoading(true) viewModelScope.launch { val result = @@ -148,19 +155,23 @@ class BraintreePalViewModel : ViewModel() { /** * 信用卡订阅支付 */ - private fun cardSubscription(activity: BaseActivity<*>, - userId: String, - paymentMethodNonce: String, - firstName: String, - lastName: String, - username: String, - deviceId: String, - setMealBean: SetMealBean) { + private fun cardSubscription( + activity: BaseActivity<*>, + userId: String, + paymentMethodNonce: String, + firstName: String, + lastName: String, + username: String, + deviceId: String, + setMealBean: SetMealBean + ) { activity.showLoading(true) viewModelScope.launch { val result = - NetworkApi.cardSubscription(userId, paymentMethodNonce, firstName, lastName, - username, deviceId, setMealBean) + NetworkApi.cardSubscription( + userId, paymentMethodNonce, firstName, lastName, + username, deviceId, setMealBean + ) mCardPaymentResultLiveData.value = result } } @@ -169,11 +180,13 @@ class BraintreePalViewModel : ViewModel() { /** * 开始调起payPal支付 */ - fun launchPayPal(activity: BaseActivity<*>, - braintreeClient: BraintreeClient?, - payPalClient: PayPalClient?, - setMealBean: SetMealBean?, - orderNo: String) { + fun launchPayPal( + activity: BaseActivity<*>, + braintreeClient: BraintreeClient?, + payPalClient: PayPalClient?, + setMealBean: SetMealBean?, + orderNo: String + ) { activity.showLoading(true) viewModelScope.launch(Dispatchers.IO) { braintreeClient?.getConfiguration { _, _ -> @@ -196,11 +209,13 @@ class BraintreePalViewModel : ViewModel() { /** * 开始调起信用卡支付,自动订阅 */ - fun launchCardPay(activity: BaseActivity<*>, - cardClient: CardClient?, - card: Card, - setMealBean: SetMealBean?, - deviceId: String) { + fun launchCardPay( + activity: BaseActivity<*>, + cardClient: CardClient?, + card: Card, + setMealBean: SetMealBean?, + deviceId: String + ) { if (null == setMealBean) return activity.apply { @@ -218,20 +233,18 @@ class BraintreePalViewModel : ViewModel() { // activity.showLoading(true) // cardPayment(activity, setMealBean.mealPackage, setMealBean.days, // setMealBean.cost.toString(), nonce, deviceId) - var list: List? - withContext(Dispatchers.IO) { - list = MyDatabase.creditCardDao().findAll(MyDatabase.CREDIT_CARD_TABLE) - } - if (null != list) { - val userId = MMKVUtil.getString(MMKVKey.UserId) - val userName = MMKVUtil.getString(MMKVKey.UserName) - for (creditCard in list!!) { - if (card.number == creditCard.cardNumber) { - //信用卡订阅支付 - cardSubscription(activity, userId, nonce, creditCard.firstName, - creditCard.lastName, userName, deviceId, setMealBean) - break - } + var list = mutableListOf() + + val userId = MMKVUtil.getString(MMKVKey.UserId) + val userName = MMKVUtil.getString(MMKVKey.UserName) + for (creditCard in list!!) { + if (card.number == creditCard.cardNumber) { + //信用卡订阅支付 + cardSubscription( + activity, userId, nonce, creditCard.firstName, + creditCard.lastName, userName, deviceId, setMealBean + ) + break } } } diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/StripePalViewModel.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/StripePalViewModel.kt index 1c71db4..b0a81e3 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/StripePalViewModel.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/activity/vm/StripePalViewModel.kt @@ -8,11 +8,11 @@ import com.abbidot.baselibrary.constant.MMKVKey import com.abbidot.baselibrary.util.LogUtil import com.abbidot.baselibrary.util.MMKVUtil import com.abbidot.tracker.base.BaseActivity +import com.abbidot.tracker.bean.CreditCardBean import com.abbidot.tracker.bean.LKSimSetMealBean import com.abbidot.tracker.bean.MenuTxtBean import com.abbidot.tracker.bean.RechargeDeviceBean import com.abbidot.tracker.bean.StripeSubscriptionPriceBean -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.retrofit2.NetworkApi import com.stripe.android.PaymentConfiguration import com.stripe.android.model.CardParams @@ -60,24 +60,22 @@ class StripePalViewModel : ViewModel() { fun startCheckout(activity: BaseActivity<*>, card: MenuTxtBean) { activity.showLoading(true) viewModelScope.launch(Dispatchers.IO) { - val list = MyDatabase.creditCardDao().findAll(MyDatabase.CREDIT_CARD_TABLE) - if (null != list) { - for (it in list) { - if (card.menuName == it.cardNumber) { - val dates = it.expirationDate.split("/") - val name = "${it.lastName} ${it.firstName}" - val params = PaymentMethodCreateParams.createCard( - CardParams( - it.cardNumber, dates[0].toInt(), dates[1].toInt(), it.cvv, name - ) + val list = mutableListOf() + for (it in list) { + if (card.menuName == it.cardNumber) { + val dates = it.expirationDate.split("/") + val name = "${it.lastName} ${it.firstName}" + val params = PaymentMethodCreateParams.createCard( + CardParams( + it.cardNumber, dates[0].toInt(), dates[1].toInt(), it.cvv, name ) - val confirmParams = - ConfirmPaymentIntentParams.createWithPaymentMethodCreateParams( - params, mPaymentIntentClientSecret - ) - mPaymentLauncher.confirm(confirmParams) - break - } + ) + val confirmParams = + ConfirmPaymentIntentParams.createWithPaymentMethodCreateParams( + params, mPaymentIntentClientSecret + ) + mPaymentLauncher.confirm(confirmParams) + break } } } diff --git a/app/src/main/java/com/abbidot/tracker/dialog/MyAlertDialog.kt b/app/src/main/java/com/abbidot/tracker/dialog/MyAlertDialog.kt index 6fee08a..288cb1f 100644 --- a/app/src/main/java/com/abbidot/tracker/dialog/MyAlertDialog.kt +++ b/app/src/main/java/com/abbidot/tracker/dialog/MyAlertDialog.kt @@ -7,6 +7,7 @@ import androidx.annotation.StyleRes import com.abbidot.tracker.R import com.abbidot.tracker.base.BaseDialog import com.abbidot.tracker.databinding.DialogMyLayoutBinding +import com.abbidot.tracker.util.ViewUtil import com.abbidot.tracker.widget.TypefaceRoundButton import com.abbidot.tracker.widget.TypefaceTextView @@ -14,11 +15,12 @@ import com.abbidot.tracker.widget.TypefaceTextView *Created by .yzq on 2021/12/24/024. * @link * @description: 自定义对话框,背景阴影 + * @dialogHeightDp 默认高度240dp */ class MyAlertDialog( context: Context, @StyleRes themeResId: Int = R.style.my_Dialog_style ) : BaseDialog( - DialogMyLayoutBinding::inflate, context, dialogHeightDp = 260, themeResId = themeResId + DialogMyLayoutBinding::inflate, context, themeResId = themeResId ) { private lateinit var mTitleTextView: TypefaceTextView @@ -55,6 +57,8 @@ class MyAlertDialog( if (!TextUtils.isEmpty(title)) { mTitleTextView.visibility = View.VISIBLE mTitleTextView.text = title + val typeface = ViewUtil.instance.setTypeface(context, ViewUtil.FONT_COMMON_NAME) + mContentTextView.setTypeface(typeface) } } diff --git a/app/src/main/java/com/abbidot/tracker/retrofit2/INetworkService.kt b/app/src/main/java/com/abbidot/tracker/retrofit2/INetworkService.kt index 6344c44..4c0e153 100644 --- a/app/src/main/java/com/abbidot/tracker/retrofit2/INetworkService.kt +++ b/app/src/main/java/com/abbidot/tracker/retrofit2/INetworkService.kt @@ -263,6 +263,23 @@ interface INetworkService { @Field("userId") userId: String, @Field("measurementUnitType") measurementUnit: Int ): BaseResponse + + /** + * 获取用户订单中是否存在开启自动续订状态 + */ + @GET("user/getOrderAutoRenewalStatus") + suspend fun getOrderAutoRenewalStatus(@Query("userId") userId: String): BaseResponse + + /** + * 移除用户支付信息 + * paymentMethodType=1为信用卡 2为PayPal + */ + @FormUrlEncoded + @POST("user/removePaymentMethodID") + suspend fun removePaymentMethodID( + @Field("userId") userId: String, @Field("paymentMethodType") paymentMethodType: Int + ): BaseResponse + /** * 获取蓝牙设备Mac */ diff --git a/app/src/main/java/com/abbidot/tracker/retrofit2/NetworkApi.kt b/app/src/main/java/com/abbidot/tracker/retrofit2/NetworkApi.kt index e846356..e98473f 100644 --- a/app/src/main/java/com/abbidot/tracker/retrofit2/NetworkApi.kt +++ b/app/src/main/java/com/abbidot/tracker/retrofit2/NetworkApi.kt @@ -109,6 +109,21 @@ object NetworkApi : BaseNetworkApi(INetworkService.BASE_URL) { service.updateMeasureUnit(userId, measurementUnit) } + /** + *获取用户订单中是否存在开启自动续订状态 + */ + suspend fun getOrderAutoRenewalStatus(userId: String) = getResult { + service.getOrderAutoRenewalStatus(userId) + } + + /** + *移除用户支付信息 + * paymentMethodType=1为信用卡 2为PayPal + */ + suspend fun removePaymentMethodID(userId: String, paymentMethodType: Int) = getResult { + service.removePaymentMethodID(userId, paymentMethodType) + } + /** * 图片上传 */ @@ -1321,8 +1336,13 @@ object NetworkApi : BaseNetworkApi(INetworkService.BASE_URL) { /** * 手机号验证码验证 */ - suspend fun validatePhoneCode(phone: String, code: String, type: Int,openidIdentifier: String) = getResult { - service.validatePhoneCode(phone, code, type,openidIdentifier) + suspend fun validatePhoneCode( + phone: String, + code: String, + type: Int, + openidIdentifier: String + ) = getResult { + service.validatePhoneCode(phone, code, type, openidIdentifier) } /** diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/HomeV2Activity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/HomeV2Activity.kt index 8798b8f..a275cbe 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/HomeV2Activity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/HomeV2Activity.kt @@ -37,7 +37,6 @@ import com.abbidot.tracker.bean.ReceiveDeviceData import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.databinding.ActivityHomeV2Binding import com.abbidot.tracker.dialog.CommonDialog1 import com.abbidot.tracker.dialog.CommonListDialog @@ -540,23 +539,6 @@ class HomeV2Activity : BaseActivity(ActivityHomeV2Binding * 显示被删除邀请的弹窗 */ private fun showDeleteInviteDialog(deleteArray: MutableList) { - lifecycleScope.launch(Dispatchers.IO) { - val myDeviceDb = MyDatabase.deviceDao().findAll(MyDatabase.DEVICE_TABLE) - myDeviceDb?.apply { - for (deviceDb in myDeviceDb) { - for (item in deleteArray) { - if (deviceDb.deviceId == item.deviceId) { - MyDatabase.deviceDao().delete(deviceDb) - LogUtil.e("删除了邀请的设备") - } - } - } - } - val newDeviceDb = MyDatabase.deviceDao().findAll(MyDatabase.DEVICE_TABLE) - newDeviceDb?.apply { - LogUtil.e("删去了邀请,还剩${newDeviceDb.size}下个设备") - } - } CommonDialog1( mContext, getString(R.string.txt_setting_notification), diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker1Activity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker1Activity.kt index 79abf6a..3a365b3 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker1Activity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker1Activity.kt @@ -74,12 +74,6 @@ class DeleteTracker1Activity : ) } } - //删除设备成功后,把本地数据库中的设备也删除 - MyDatabase.deviceDao().deleteByParams( - ConstantString.DeviceId, - device.deviceId, - MyDatabase.DEVICE_TABLE - ) runOnUiThread { showDeleteDialog() } diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker2Activity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker2Activity.kt index 56d50aa..67b6a8d 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker2Activity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/device/DeleteTracker2Activity.kt @@ -20,7 +20,6 @@ import com.abbidot.tracker.bean.ReceiveDeviceData import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.databinding.ActivityDeleteTracker2Binding import com.abbidot.tracker.dialog.CommonDialog1 import com.abbidot.tracker.util.Util @@ -162,12 +161,6 @@ class DeleteTracker2Activity : withContext(Dispatchers.IO) { mDeviceBean?.let { device -> SRBleUtil.instance.disconnectToMac(device.macId) - //删除设备成功后,把本地数据库中的设备也删除 - MyDatabase.deviceDao().deleteByParams( - ConstantString.DeviceId, - device.deviceId, - MyDatabase.DEVICE_TABLE - ) runOnUiThread { showDeleteDialog() } diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/device/MyTrackerV2Activity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/device/MyTrackerV2Activity.kt index e7b8ea4..a938341 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/device/MyTrackerV2Activity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/device/MyTrackerV2Activity.kt @@ -166,14 +166,8 @@ class MyTrackerV2Activity : //保存本地数据库 if (!TextUtils.isEmpty(device.deviceOutId) && null != device.pet) { bindDeviceNumber++ -// MyDatabase.deviceDao().insert(device) } else if (!TextUtils.isEmpty(device.deviceOutId) && null == device.pet) { //删除本地没绑定的设备 - MyDatabase.deviceDao().deleteByParams( - ConstantString.DeviceId, - device.deviceId, - MyDatabase.DEVICE_TABLE - ) } } if (bindDeviceNumber == 1) isOnlyBindOneDevice = true @@ -269,15 +263,6 @@ class MyTrackerV2Activity : dealRequestResult(it, object : GetResultCallback { override fun onResult(any: Any) { lifecycleScope.launch { - withContext(Dispatchers.IO) { - val device = mMyTrackerAdapter.getData()[mCurrentBeanOption] - //解绑成功后,把本地数据库中的设备也删除 - MyDatabase.deviceDao().deleteByParams( - ConstantString.DeviceId, - device.deviceId, - MyDatabase.DEVICE_TABLE - ) - } mUnAssignDeviceList.clear() mUnAssignPetList.clear() XEventBus.post(EventName.RefreshPet) diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt index 5bfea8e..b835949 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/AddCreditCardPaymentActivity.kt @@ -21,7 +21,6 @@ import com.abbidot.tracker.bean.CreditCardBean import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.databinding.ActivityAddCreditCardPaymentBinding import com.abbidot.tracker.util.ThirdPartyUtil import com.abbidot.tracker.util.Util @@ -211,143 +210,7 @@ class AddCreditCardPaymentActivity : } } - private fun confirmSaveCard() { - val cardNumber = - mViewBinding.ilAddCardNumber.etInputView2Content.text.toString().replace(" ", "") - val cardName = mViewBinding.ilAddCardNameOnCard.etInputView2Content.text.toString() - val creditCardValidity = mViewBinding.etAddCardMmDdContent.text.toString() - val cvv = mViewBinding.etAddCardCvcContent.text.toString() - if (TextUtils.isEmpty(cardNumber) || TextUtils.isEmpty(cardName) || TextUtils.isEmpty( - creditCardValidity - ) || TextUtils.isEmpty(cvv) - ) { - showToast(R.string.txt_not_null) - return - } - - if (!creditCardValidity.contains("/")) { - showToast(R.string.txt_card_validity_format) - return - } else { - val dates = creditCardValidity.split("/") - try { - if (dates[0].toInt() > 12) { - showToast(R.string.txt_card_validity_format) - return - } - } catch (e: Exception) { - showToast(R.string.txt_card_validity_format) - return - } - } - if (Util.getCreditCardType(cardNumber) == 0 || cardNumber.length < 9) { - showToast(R.string.txt_card_number_format) - return - } - - lifecycleScope.launch(Dispatchers.IO) { - val list = MyDatabase.creditCardDao().findAll(MyDatabase.CREDIT_CARD_TABLE) - var existCard: CreditCardBean? = null - list?.apply { - if (isNotEmpty()) { - for (c in list) { - if (!isEdit && c.cardNumber == cardNumber) { - existCard = c - break - } else if (isEdit && null != mOldCard && c.cardNumber == mOldCard!!.cardNumber) { - existCard = c - break - } - } - } - } - if (isEdit) { - existCard?.let { - it.cardName = cardName - it.cardNumber = cardNumber - it.expirationDate = creditCardValidity - it.cvv = cvv - it.isPrimary = mViewBinding.cbAddCardSetPrimarySwitch.isChecked - if (null != mOldCard && mOldCard!!.cardNumber != cardNumber) { - MyDatabase.creditCardDao().delete(mOldCard!!) - } - saveCard(list) - } - } else { - if (null != existCard) { - launch(Dispatchers.Main) { - ViewUtil.instance.showDialog( - mContext, - R.string.txt_credit_card_exists, - object : BaseDialog.OnDialogOkListener { - override fun onOkClick(dialog: BaseDialog<*>) { - dialog.dismiss() - lifecycleScope.launch(Dispatchers.IO) { - saveCard(list) - } - } - }, - okTextResId = R.string.start_txt_yes, - cancelTextResId = R.string.txt_no - ) - } - } else saveCard(list) - } - } - } - - /** - * 保存信用卡 - */ - private fun saveCard(list: List?) { - mViewBinding.apply { - val cardNumber = ilAddCardNumber.etInputView2Content.text.toString().replace(" ", "") - val cardName = ilAddCardNameOnCard.etInputView2Content.text.toString() - val creditCardValidity = etAddCardMmDdContent.text.toString() - val cvv = etAddCardCvcContent.text.toString() - if (cbAddCardSetPrimarySwitch.isChecked) { - mCreditCard?.isPrimary = true - list?.apply { - if (isNotEmpty()) { - for (c in list) { - if (c.isPrimary) { - c.isPrimary = false - MyDatabase.creditCardDao().update(c) - } - } - } - } - } - - mCreditCard?.let { - if (isEdit) { - list?.apply { - if (isNotEmpty()) { - for (c in list) { - //因卡号唯一,编辑卡号删除存在的信用卡 - if (c.cardNumber == it.cardNumber) { - MyDatabase.creditCardDao().delete(c) - } - } - } - } - } - it.cardNumber = cardNumber - it.cardName = cardName - it.expirationDate = creditCardValidity - it.cvv = cvv -// MyDatabase.creditCardDao().insert(it) - } - - runOnUiThread { -// val intent = Intent() -// intent.putExtra(ConstantString.Card, mCreditCard) - setResult(ResultCode.ResultCode_1, null) - showToast(R.string.txt_save_successful, isFinish = true) - } - } - } private fun confirmSaveCardV2() { mViewBinding.apply { @@ -416,12 +279,10 @@ class AddCreditCardPaymentActivity : } }) } else { -// MyDatabase.creditCardDao().deleteAll(MyDatabase.CREDIT_CARD_TABLE) it.cardNumber = cardNumber it.cardName = cardName it.expirationDate = creditCardValidity it.cvv = cvv -// MyDatabase.creditCardDao().insert(it) runOnUiThread { val intent = Intent() intent.putExtra(ConstantString.Card, it) @@ -440,7 +301,7 @@ class AddCreditCardPaymentActivity : override fun onOkClick(dialog: BaseDialog<*>) { lifecycleScope.launch(Dispatchers.IO) { mCreditCard?.apply { - MyDatabase.creditCardDao().delete(this) +// MyDatabase.creditCardDao().delete(this) } } dialog.dismiss() diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentMethodActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentMethodActivity.kt index d9b0a40..703c4f9 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentMethodActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/PaymentMethodActivity.kt @@ -1,13 +1,16 @@ package com.abbidot.tracker.ui.activity.subscribe +import android.view.Gravity import androidx.activity.viewModels import androidx.fragment.app.Fragment import androidx.viewpager2.widget.ViewPager2 import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.eventbus.XEventBus +import com.abbidot.baselibrary.util.AppUtils import com.abbidot.tracker.R import com.abbidot.tracker.adapter.ViewPagerAdapter import com.abbidot.tracker.base.BaseActivity +import com.abbidot.tracker.base.BaseDialog import com.abbidot.tracker.bean.PaymentIDBean import com.abbidot.tracker.bean.SubscriptionsOrderBean import com.abbidot.tracker.constant.ConstantInt @@ -37,6 +40,9 @@ class PaymentMethodActivity : //支付id var mPaymentIDBean: PaymentIDBean? = null + //删除支付方式id + private var mRemovePaymentMethodType = 0 + override fun getTopBar() = mViewBinding.ilPaymentMethodTopBar.titleTopBar override fun initData() { @@ -90,18 +96,86 @@ class PaymentMethodActivity : finish() } - mSubscriptionPayViewModel.mPaymentMethodIDLiveData.observe(this) { - dealRequestResult(it, object : GetResultCallback { - override fun onResult(any: Any) { - it.getOrNull()?.let { p -> - mPaymentIDBean = p - (mPayFragments[0] as CreditCardPaymentFragment).getCardData(p.stripeMethodInfo) - if (mPayFragments.size > 1) { - (mPayFragments[1] as PaypalPaymentFragment).showPaypalInfo() + mSubscriptionPayViewModel.apply { + mPaymentMethodIDLiveData.observe(this@PaymentMethodActivity) { + dealRequestResult(it, object : GetResultCallback { + override fun onResult(any: Any) { + it.getOrNull()?.let { p -> + mPaymentIDBean = p + (mPayFragments[0] as CreditCardPaymentFragment).getCardData(p.stripeMethodInfo) + if (mPayFragments.size > 1) { + (mPayFragments[1] as PaypalPaymentFragment).showPaypalInfo() + } } } - } - }) + }) + } + + mOrderAutoRenewalStatusLiveData.observe(this@PaymentMethodActivity) { + dealRequestResult(it, object : GetResultCallback { + override fun onResult(any: Any) { + it.getOrNull()?.let { d -> + showRemoveDialog(d.isNeedCancel) + } + } + }) + } + + mRemovePaymentMethodLiveData.observe(this@PaymentMethodActivity) { + dealRequestResult(it, object : GetResultCallback { + override fun onResult(any: Any) { + showToast(R.string.txt_delete_succe, gravity = Gravity.CENTER) + getUserPaymentMethodID() + } + }) + } + } + } + + /** + * 删除支付方式 + * @param paymentMethodType 支付方式类型 1为信用卡 2为PayPal + */ + fun removePaymentMethodID(paymentMethodType: Int) { + mRemovePaymentMethodType = paymentMethodType + mSubscriptionPayViewModel.getOrderAutoRenewalStatus() + } + + /** + * 显示删除支付方式弹窗 + * @param haveAutoRenewal 是否有自动续费 1为有 0为无 + */ + private fun showRemoveDialog(haveAutoRenewal: Int) { + if (haveAutoRenewal == ConstantInt.Type1) { + ViewUtil.instance.showDialog( + this@PaymentMethodActivity, + R.string.txt_remove_pay_method_tips2, + object : BaseDialog.OnDialogOkListener { + override fun onOkClick(dialog: BaseDialog<*>) { + dialog.dismiss() + mSubscriptionPayViewModel.removePaymentMethodID( + mRemovePaymentMethodType + ) + } + }, + getString(R.string.txt_auto_renewal_on), + R.string.txt_turn_off_remove, R.string.txt_cancel + ) + } else { + ViewUtil.instance.showDialog( + this@PaymentMethodActivity, + R.string.txt_remove_pay_method_tips1, + object : BaseDialog.OnDialogOkListener { + override fun onOkClick(dialog: BaseDialog<*>) { + dialog.dismiss() + mSubscriptionPayViewModel.removePaymentMethodID( + mRemovePaymentMethodType + ) + } + }, + getString(R.string.txt_remove_pay_method) + if (AppUtils.isChina()) "?" else "?", + R.string.txt_remove, R.string.txt_cancel + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/CreditCardPaymentFragment.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/CreditCardPaymentFragment.kt index 85ce9d6..e52b47b 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/CreditCardPaymentFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/CreditCardPaymentFragment.kt @@ -14,6 +14,7 @@ import com.abbidot.tracker.R import com.abbidot.tracker.adapter.CreditCardAdapter import com.abbidot.tracker.base.BaseFragment import com.abbidot.tracker.bean.CreditCardBean +import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.FragmentCreditCardPaymentBinding @@ -85,7 +86,11 @@ class CreditCardPaymentFragment : BaseFragment ) ilCreditCardPaymentNoData.btnSureSubscribePlan1Continue.visibility = View.GONE - setOnClickListenerViews(btnCreditCardPaymentAdd, btnMakePaymentCreditCard) + setOnClickListenerViews( + btnCreditCardPaymentAdd, + btnMakePaymentCreditCard, + btnCreditCardPaymentRemove + ) } // getCardData() } @@ -126,9 +131,11 @@ class CreditCardPaymentFragment : BaseFragment btnCreditCardPaymentAdd.visibility = View.INVISIBLE //卡管理 不需要点击效果 if (null == getHostActivity(PaymentMethodActivity::class.java)?.mOrderBean) { + btnCreditCardPaymentRemove.visibility = View.VISIBLE btnMakePaymentCreditCard.visibility = View.GONE } else { stripeMethodInfo.checked = true + btnCreditCardPaymentRemove.visibility = View.GONE btnMakePaymentCreditCard.visibility = View.VISIBLE } } @@ -207,6 +214,7 @@ class CreditCardPaymentFragment : BaseFragment } //卡管理 不需要点击效果 if (null == getHostActivity(PaymentMethodActivity::class.java)?.mOrderBean) { + mViewBinding.btnCreditCardPaymentRemove.visibility = View.VISIBLE mViewBinding.btnMakePaymentCreditCard.visibility = View.GONE } else { var haveCheck = false @@ -219,6 +227,7 @@ class CreditCardPaymentFragment : BaseFragment if (!haveCheck) { list[0].checked = true } + mViewBinding.btnCreditCardPaymentRemove.visibility = View.GONE mViewBinding.btnMakePaymentCreditCard.visibility = View.VISIBLE } mViewBinding.apply { @@ -327,6 +336,9 @@ class CreditCardPaymentFragment : BaseFragment } override fun onClick(v: View?) { + if (isLimitClick()) + return + mViewBinding.apply { when (v!!) { btnCreditCardPaymentAdd -> { @@ -334,6 +346,10 @@ class CreditCardPaymentFragment : BaseFragment launchActivity(mActivity!!, mActivityResultLauncher, intent) } + btnCreditCardPaymentRemove -> getHostActivity(PaymentMethodActivity::class.java)?.removePaymentMethodID( + ConstantInt.Type1 + ) + btnMakePaymentCreditCard -> startCreditCardPayment() } } diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/PaypalPaymentFragment.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/PaypalPaymentFragment.kt index a976f59..7e7640b 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/PaypalPaymentFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/subscribe/PaypalPaymentFragment.kt @@ -7,6 +7,7 @@ import android.view.View import androidx.fragment.app.viewModels import com.abbidot.tracker.R import com.abbidot.tracker.base.BaseFragment +import com.abbidot.tracker.constant.ConstantInt import com.abbidot.tracker.constant.ConstantString import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.FragmentPaypalPaymentBinding @@ -33,7 +34,7 @@ class PaypalPaymentFragment : override fun initData() { mViewBinding.apply { root.setBackgroundResource(R.color.transparent) - setOnClickListenerViews(btnSureRedirectPaypal) + setOnClickListenerViews(btnSureRedirectPaypal, btnPaypalPaymentRemove) ilPaypalPaymentNoData.btnSureSubscribePlan1Continue.visibility = View.GONE getHostActivity(PaymentMethodActivity::class.java)?.let { @@ -65,6 +66,7 @@ class PaypalPaymentFragment : View.GONE else View.VISIBLE + btnPaypalPaymentRemove.visibility = tvPaypalPaymentEmail.visibility ilPaypalPaymentNoData.root.visibility = if (null == it.mOrderBean && TextUtils.isEmpty(pId.paypalMethodInfo.email)) { @@ -105,12 +107,19 @@ class PaypalPaymentFragment : } override fun onClick(v: View?) { + if (isLimitClick()) + return + mViewBinding.apply { when (v!!) { btnSureRedirectPaypal -> getHostActivity(PaymentMethodActivity::class.java)?.mOrderBean?.let { showNoCancelableLoading(true) mSubscriptionPayViewModel.createPaypalOrder(it) } + + btnPaypalPaymentRemove -> getHostActivity(PaymentMethodActivity::class.java)?.removePaymentMethodID( + ConstantInt.Type2 + ) } } } diff --git a/app/src/main/java/com/abbidot/tracker/util/Util.kt b/app/src/main/java/com/abbidot/tracker/util/Util.kt index 1182be6..23b24df 100644 --- a/app/src/main/java/com/abbidot/tracker/util/Util.kt +++ b/app/src/main/java/com/abbidot/tracker/util/Util.kt @@ -621,10 +621,6 @@ class Util { //保存最后一次登录的邮箱 MMKVUtil.putString(MMKVKey.Email, email) MMKVUtil.putString(MMKVKey.Phone, phone) - withContext(Dispatchers.IO) { - MyDatabase.deviceDao().deleteAll(MyDatabase.DEVICE_TABLE) - MyDatabase.creditCardDao().deleteAll(MyDatabase.CREDIT_CARD_TABLE) - } activity.startActivityFinish(Intent(activity, SayHelloActivity::class.java)) } } 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 9d5fb83..6907d9f 100644 --- a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt +++ b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt @@ -988,7 +988,7 @@ class ViewUtil private constructor() { * 适配不同语言跳转h5 */ fun goHtmlAssetContent(activity: Activity, title: String, fileKey: String) { - val url="file:///android_asset/$fileKey" + val url = "file:///android_asset/$fileKey" LogUtil.e(url) WebViewActivity.startWebViewActivity(activity, title, url) } diff --git a/app/src/main/java/com/abbidot/tracker/vm/ConnectionDeviceViewModel.kt b/app/src/main/java/com/abbidot/tracker/vm/ConnectionDeviceViewModel.kt index fcc8dad..7a1626f 100644 --- a/app/src/main/java/com/abbidot/tracker/vm/ConnectionDeviceViewModel.kt +++ b/app/src/main/java/com/abbidot/tracker/vm/ConnectionDeviceViewModel.kt @@ -1,6 +1,5 @@ package com.abbidot.tracker.vm -import android.content.Context import android.os.CountDownTimer import android.text.TextUtils import androidx.lifecycle.ViewModel @@ -11,14 +10,11 @@ import com.abbidot.baselibrary.eventbus.XEventBus import com.abbidot.baselibrary.util.LogUtil import com.abbidot.tracker.R import com.abbidot.tracker.base.BaseActivity -import com.abbidot.tracker.bean.DeviceBean -import com.abbidot.tracker.database.MyDatabase import com.abbidot.tracker.util.Util import com.abbidot.tracker.util.bluetooth.SRBleUtil import com.clj.fastble.BleManager import com.clj.fastble.callback.BleScanCallback import com.clj.fastble.data.BleDevice -import com.clj.fastble.data.BleScanState import com.clj.fastble.scan.BleScanRuleConfig import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay @@ -33,88 +29,6 @@ class ConnectionDeviceViewModel : ViewModel() { private var mCountDownTimer: CountDownTimer? = null - fun autoConnectBleDevice(context: Context) { - //判断蓝牙是否打开 - if (!SRBleUtil.instance.isBleEnable(context)) { - LogUtil.e("automaticConnection,蓝牙没打开") - return - } - if (BleManager.getInstance().scanSate == BleScanState.STATE_SCANNING) { - LogUtil.e("automaticConnection,已经在扫描蓝牙,开始扫描失败") - return - } - viewModelScope.launch(Dispatchers.IO) { - val localDevices = MyDatabase.deviceDao() - .findAll(MyDatabase.DEVICE_TABLE) as MutableList - LogUtil.e("查找本地ble设备有${localDevices.size}个") - if (localDevices.size == 0) { - return@launch - } - val scanTrackBle = mutableListOf() - val scanRuleConfig = BleScanRuleConfig.Builder().build() - BleManager.getInstance().initScanRule(scanRuleConfig) - BleManager.getInstance().scan(object : BleScanCallback() { - override fun onScanStarted(success: Boolean) { - SRBleUtil.instance.isScanInterrupt = false - LogUtil.e("开始扫描...$success") - } - - override fun onScanning(bleDevice: BleDevice?) { - LogUtil.d("onScanning....$bleDevice") - bleDevice?.apply { - if (null != name && name.contains(SRBleUtil.instance.trackDeviceBleStartName)) { - scanTrackBle.add(this) - } - } - } - - override fun onScanFinished(scanResultList: MutableList?) { - val interrupt = SRBleUtil.instance.isScanInterrupt - LogUtil.e("automaticConnection--扫描完成..中断扫描$interrupt,${scanResultList?.size}") - if (!interrupt) { - compareDevice(scanTrackBle, localDevices) - } - } - }) - } - } - - /** - * 从扫描到的设备中查找已添加的设备,并连接设备 - */ - private fun compareDevice( - scanResultList: MutableList, localDevices: MutableList - ) { - if (scanResultList.size > 0) { - var connected = false - viewModelScope.launch(Dispatchers.IO) { - //创建新的变量,防止别的蓝牙扫描(蓝牙找设备功能)改变scanResultList变量,导致异常 - val scanBleList = mutableListOf() - scanBleList.addAll(scanResultList) - for (device in localDevices) { - for (bleDevice in scanBleList) { - if (!TextUtils.isEmpty(bleDevice.name)) { - if (device.macId == bleDevice.mac) { - SRBleUtil.instance.connect(bleDevice) - connected = true - break - } - } - } - } - if (!connected) { - LogUtil.e("没有蓝牙设备可连") - SRBleUtil.instance.isBleConnecting = false -// XEventBus.post(EventName.ActionConDeviceState, ConState.DEVICE_NOT_FOUND) - } - } - } else { - LogUtil.e("蓝牙设备为0") - SRBleUtil.instance.isBleConnecting = false -// XEventBus.post(EventName.ActionConDeviceState, ConState.DEVICE_NOT_FOUND) - } - } - /** * 连接中倒计时20s变为未连接状态 */ diff --git a/app/src/main/java/com/abbidot/tracker/vm/SubscriptionPayViewModel.kt b/app/src/main/java/com/abbidot/tracker/vm/SubscriptionPayViewModel.kt index 4e180b0..c6a411a 100644 --- a/app/src/main/java/com/abbidot/tracker/vm/SubscriptionPayViewModel.kt +++ b/app/src/main/java/com/abbidot/tracker/vm/SubscriptionPayViewModel.kt @@ -9,6 +9,7 @@ import com.abbidot.baselibrary.util.MMKVUtil import com.abbidot.baselibrary.util.Utils import com.abbidot.baselibrary.util.rsa.RSA import com.abbidot.tracker.bean.CreditCardBean +import com.abbidot.tracker.bean.OrderBean import com.abbidot.tracker.bean.PayResultBean import com.abbidot.tracker.bean.PaymentIDBean import com.abbidot.tracker.bean.StripeSubscriptionPriceBean @@ -30,6 +31,8 @@ class SubscriptionPayViewModel : ViewModel() { val mCreatePaypalOrderLiveData = MutableLiveData>() val mPaymentMethodIDLiveData = MutableLiveData>() val mSavePaymentMethodIDLiveData = MutableLiveData>() + val mOrderAutoRenewalStatusLiveData = MutableLiveData>() + val mRemovePaymentMethodLiveData = MutableLiveData>() /** * Stripe支付创建消费用户 @@ -88,4 +91,27 @@ class SubscriptionPayViewModel : ViewModel() { mSavePaymentMethodIDLiveData.value = result } } + + /** + *获取用户订单中是否存在开启自动续订状态 + */ + fun getOrderAutoRenewalStatus() { + viewModelScope.launch { + val userId = MMKVUtil.getString(MMKVKey.UserId) + val result = NetworkApi.getOrderAutoRenewalStatus(userId) + mOrderAutoRenewalStatusLiveData.value = result + } + } + + /** + *移除用户支付信息 + * paymentMethodType=1为信用卡 2为PayPal + */ + fun removePaymentMethodID(paymentMethodType: Int) { + viewModelScope.launch { + val userId = MMKVUtil.getString(MMKVKey.UserId) + val result = NetworkApi.removePaymentMethodID(userId, paymentMethodType) + mRemovePaymentMethodLiveData.value = result + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_my_layout.xml b/app/src/main/res/layout/dialog_my_layout.xml index cf8eaab..b664646 100644 --- a/app/src/main/res/layout/dialog_my_layout.xml +++ b/app/src/main/res/layout/dialog_my_layout.xml @@ -4,63 +4,63 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog" - android:paddingStart="@dimen/dp_8" - android:paddingEnd="@dimen/dp_8"> + android:gravity="center" + android:paddingHorizontal="@dimen/dp_8"> - - + - + + + + - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_credit_card_payment.xml b/app/src/main/res/layout/fragment_credit_card_payment.xml index 0702af6..2e20e00 100644 --- a/app/src/main/res/layout/fragment_credit_card_payment.xml +++ b/app/src/main/res/layout/fragment_credit_card_payment.xml @@ -27,15 +27,38 @@ app:qmui_borderWidth="@dimen/dp_1" app:typeface="@string/roboto_bold_font" /> - + android:gravity="center_horizontal" + android:orientation="vertical"> + + + + + diff --git a/app/src/main/res/layout/fragment_paypal_payment.xml b/app/src/main/res/layout/fragment_paypal_payment.xml index a071e24..be0f710 100644 --- a/app/src/main/res/layout/fragment_paypal_payment.xml +++ b/app/src/main/res/layout/fragment_paypal_payment.xml @@ -21,12 +21,12 @@ android:id="@+id/tv_paypal_payment_email" style="@style/my_TextView_style_v2" android:layout_width="match_parent" - android:gravity="start|center" - android:layout_marginHorizontal="@dimen/dp_16" android:layout_height="@dimen/dp_56" + android:layout_marginHorizontal="@dimen/dp_16" android:background="@drawable/shape8_dark_gray_border_white_yellow_bg" android:drawableStart="@drawable/icon_payment_paypal_svg" android:drawablePadding="@dimen/dp_6" + android:gravity="start|center" android:paddingStart="@dimen/dp_20" android:text="@string/app_name" android:textSize="@dimen/textSize16" @@ -61,4 +61,18 @@ android:layout_centerHorizontal="true" android:src="@drawable/icon_payment_paypal_svg" /> + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f1285c9..90e02f5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -897,5 +897,13 @@ terms_de.html privacy_de.html subscription_terms_conditions_de.html + Copyright © %d ABBIDOT. Alle Rechte vorbehalten Sitzung abgelaufen. Bitte erneut anmelden + + Zahlungsmethode entfernen + Möchten Sie diese Zahlungsmethode wirklich entfernen? + Bitte deaktivieren Sie die automatische Verlängerung, bevor Sie Ihre Zahlungsmethode entfernen. + Automatische Verlängerung ist aktiviert + Entfernen + Deaktivieren & entfernen \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 545085c..4c6fcb8 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -899,4 +899,11 @@ privacy_fr.html subscription_terms_conditions_fr.html Session expirée. Veuillez vous reconnecter + + Supprimer le mode de paiement + Voulez-vous vraiment supprimer ce mode de paiement ? + Veuillez désactiver le renouvellement automatique avant de supprimer votre mode de paiement. + Renouvellement automatique activé + Supprimer + Désactiver et supprimer \ No newline at end of file diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6f2ebc4..17f409a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,67 +1,85 @@ - La mia piccola - Misura dal pavimento fino al punto più a \nlto delle scapole del tuo pet + Misura dal pavimento fino al punto più alto delle scapole del tuo \npet Batteria: %s%% %s Anni %d lb Versione%s - Termini e condizioni + Termini & Condizioni Accetta l\'Informativa sulla privacy e i Termini. Il tracker è abbinato a %s - Obiettivo dell\’attività + Obiettivo dell’attività Ora di fine - Personalizza la routine quotidiana del tuo animale domestico per divertirti con \nimpegno mattutino e serale focalizzato, considerando \nleloro esigenze, specie e razza. + Personalizza la routine quotidiana del tuo animale domestico per divertirti con \'impegno mattutino e serale focalizzato, considerando \n\nle loro esigenze, specie e razza. +\tInvita Il tuo familiare o amico condiviso può tracciare la posizione e la data del tuo \npet senza la possibilità di modificarli. Inserisci il codice a 4 cifre inviato a %s. Tempo rimanente:\t - Registrandoti, accetti i Termini e condizioni e l\'Informativa sulla privacy di Nation Remit. + Registrandoti accetti i Termini & Condizioni e Confermare che l\'ID di 6 caratteri corrisponda a quello \non sul retro del tracker. Individua l\'ID di 6 caratteri sul retro del \ntracker. L\'ID del tracker è errato, verifica \ne riprova Parato con \nsuccesso (Rinnovare a Questa è la casa del tuo animale domestico? - Annulla assegnazione %s - •\tNecessarioper una sincronizzazione accurata delle attività. - •\tMostra la tua posizione sulla mappa\n•\ tRichiesta di sincronizzazione dei dati di attività\n•\ tMigliora la precisione del tracker + •\tNecessario per una sincronizzazione accurata delle attività. + •\tMostra la tua posizione sulla mappa\n•\tNecessario per sincronizzare i dati attività\n•\tMigliora la precisione del tracker •\tConsenti alle notifiche di tenere traccia delle informazioni importanti, ad esempio se il tuo amico ha lasciato una zona sicura o se dovresti prendere in considerazione la ricarica del tuo dispositivo. - Registrazione \nconsuccesso! + Registrazione\nconsuccesso! Batteria inferiore a %s%% - Seleziona \'Animale domestico\' > \'Tracker\'. Fai clic su \'Aggiornamento GPS\' Seleziona3/5/10/15 minuti. + Seleziona \'Pet\' > \'Tracker\'. Fare clic su \'Aggiornamento GPS\' Selezionare 3/5/10/15 minuti. (Intervalli di rete più brevi scaricano più velocemente la batteria del Tracker. Per impostazione predefinita, la rete si riconnette ogni 15 minuti.) - Quando la modalità Live è attivata, il Tracker entra in uno stato di posizionamento e networking rapido, di solito entro 15–20 secondi. Questa modalità scarica la batteria più velocemente, quindi è meglio riservarla alle situazioni di emergenza. + Quando la modalità Live è attivata, il Tracker entra in uno stato di posizionamento e networking rapido, di solito entro 15-20 secondi. Questa modalità scarica la batteria più velocemente, quindi è meglio riservarla alle situazioni di emergenza. + Rinnovo: Invierà il codice di verifica a %s. - Passa a Prime per sbloccare \nFunzionalità esclusive! + Passa a Prime per sbloccare\nFunzionalità esclusive! Rilevata nuova versione firmware: %s - "%s" ti invita a effettuare il check-in su "%s" - Il tuo abbonamento è scaduto, \ntipreghiamo di ricaricarlo + "%@" ti invita a effettuare il check-in su "%@" + Il tuo abbonamento è scaduto,\ntipreghiamo di ricaricarlo Set recinzioni %s %s è nelle vicinanze - Scollega il tuo Tracker dal tuo account solo se lo restituisci o lo dai via. + Scollega il tuo Tracker dal tuo account solo se lo stai restituendo o regalando. Avvicinare il telefono al tracker %s. Aggiornato: %s Vicino a %s /giorno - - Localizzazione&#8230; - Si è addormentato %s fa + Localizzazione… + Caduto addormentato %sago Sposta %s per svegliarti (%s fa) La configurazione iniziale può richiedere %s minuti - 1. Muoviti all\'aperto con il dispositivo\n2. Attendere la connessione GPS LTE &amp;\n3. Blu lampeggiante = LTE &amp; GPS attivo - 1. Muoviti all\'aperto con il dispositivo\n2. Attendere la connessione GPS LTE &amp;\n3. Verde lampeggiante = LTE &amp; GPS attivo + 1. Muoviti all\'aperto con il dispositivo\n2. Attendi la connessione LTE e GPS\n3. Blu lampeggiante = LTE e GPS attivi + 1. Muoviti all\'aperto con il dispositivo\n2. Attendi la connessione LTE e GPS\n3. Verde lampeggiante = LTE e GPS attivi %s min - %s Min + %s min Sì Il numero della carta esiste già. Sovrascriverlo? Il Wi-Fi garantisce che il tuo tracker rimanga connesso quando i segnali LTE sono deboli. Rinnovo: $%s/%s giorno su %s /giorno x%s %s Anno Cura + 1 sostituzione/anno, qualsiasi motivo + Salvato. Attivo quando è online. + Il periodo di rimborso è scaduto + Politica di rimborso\n + Rimborso automatico (entro 48 ore) + Tutti gli acquisti in abbonamento hanno diritto a un rimborso automatico completo entro 48 ore dal pagamento. I rimborsi verranno elaborati automaticamente senza revisione manuale.\n + Finestra di rimborso standard (30 giorni) + Dopo il periodo iniziale di 48 ore, gli utenti possono richiedere un rimborso entro 30 giorni dall’acquisto.\n\t1.Tutti i piani di abbonamento (3 mesi, 1 anno, 2 anni) sono idonei\n\t2.Le richieste di rimborso sono soggette a verifica e approvazione\n\t3.I rimborsi possono essere adeguati parzialmente in base all’utilizzo e al consumo del servizio\n + Gli abbonamenti più vecchi di 30 giorni non sono rimborsabili. + Nessun rimborso dopo 30 giorni + Arredamento per il + Parco + Giocare + Non sicuro + Orto + Acqua + È un piacere rivederti + E-mail + Password + Hai dimenticato la password? Non hai ancora un account? Inizia Torna al login @@ -79,8 +97,8 @@ Cancella la cache Commenti Tipo di domanda (obbligatorio) - Informazioni sull\'app - Informazioni su Tracker + Info app + Info tracker Altro Inserisci il tuo problema o suggerimento Lasciaci la tua email in modo che possiamo aiutarti più velocemente @@ -95,32 +113,11 @@ Tag Attiva No, grazie - Strumento di monitoraggio delle squadre - LED Light + Il mio tracker + Luce LED Nuovo Assistente animali Sblocca - Non sicuro - Orto - Acqua - È un piacere rivederti - E-mail - Password - Hai dimenticato la password? - Nessun rimborso dopo 30 giorni - Arredamento per il - Parco - Giocare - 1 sostituzione/anno, qualsiasi motivo - Salvato. Attivo quando è online. - Il periodo di rimborso è scaduto - Politica di rimborso - Rimborso automatico (entro 48 ore) - Dopo il periodo iniziale di 48 ore, gli utenti possono richiedere un rimborso entro 30 giorni dall\'acquisto.\n\t1.Tutti i piani di abbonamento (3 mesi, 1 anno, 2 anni) sono idonei\n\t2.Le richieste di rimborso sono soggette a revisione e approvazione\n\t3.I rimborsi possono essere parzialmente adeguati in base all\'utilizzo e al consumo di servizi\n - Tutti gli acquisti in abbonamento hanno diritto a un rimborso automatico completo entro 48 ore dal pagamento. I rimborsi verranno elaborati automaticamente senza revisione manuale.\n - Finestra di rimborso standard (30 giorni) - Gli abbonamenti più vecchi di 30 giorni non sono rimborsabili. - - Network + Rete GPS Bluetooth connesso Bluetooth non connesso @@ -136,10 +133,11 @@ Accolta. Modalità respirazione LAMPEGGIATORE + Il mio animale Maschio Femmina Modificare - Stop Live + Ferma live Annulla Tempo attivazione Calorie @@ -150,7 +148,7 @@ miglio kcal Si prega di compilare completamente - Successful + Operazione riuscita Caricamento completato Salvato con successo Accesso riuscito @@ -162,7 +160,7 @@ Oggi min giorni - Stop Live Tracking? + Interrompere il tracking live? Elimina Annulla Lun @@ -190,481 +188,484 @@ Pagamento non riuscito, riprova. Connessione al Bluetooth La cancellazione del tuo account cancellerà definitivamente tutti i dati. Sei sicuro? - Incorrect username or password + Nome utente o password errati Errore del codice di verifica - Verification code expired - User does not exist - User already exists - Reset password - Privacy Policy - Website - Turn on phone Bluetooth please - You cannot share with yourself + Codice di verifica scaduto + L\'utente non esiste + L\'utente esiste già + Reimposta password + Informativa sulla privacy + Sito web + Attiva il Bluetooth del telefono + Non puoi condividere con te stesso Online Offline - Firmware Version - Upgrade - Device does not exist - Disconnected - Already latest version - Activity - Route - Pet - More + Versione firmware + Aggiorna + Il dispositivo non esiste + Disconnesso + È già disponibile l\'ultima versione + Attività + Percorso + Animale + Altro KM - Sleep + Sonno Live Tracker - Badges - View all - Manage - Time - WiFi Zone - Connected - Weak signal + Badge + Visualizza tutto + Gestisci + Ora + Zona WiFi + Connesso + Segnale debole Bluetooth - Light - Check the track and points - Read All - Subscription - Help - How It Works - - Units Setting - Sign Out - Calories Avg. - Time Avg. - Total Data - hrs - Last 7 days - Last 30 days - Ok - January - February - March - April - May - June - July - August - September - October - November - December - As sound speeds up, the distance is closer. - Stop Radar - Edit WiFi Zone - WiFi Name: - Safe Zone - + Add new - No-go Zone - No zone added, yet - Add Safe Zone - Edit Safe Zone - Fence Name - Zone Name - Add No-go Zone - Edit No-go Zone - Data Board - hr - Set Daily Goal - Awesome! Ready to begin! + Chiaro + Controllare la pista e i punti + Leggi tutto + Abbonamento + Aiuto + Come funziona + Impostazione unità + Esci + Calorie medie + Tempo medio + Dati totali: + ore + Ultimi 7 giorni + Ultimi 30 giorni + OK + Gennaio + Febbraio + Marzo + Aprile + Maggio + Giugno + Luglio + Agosto + Settembre + Ottobre + Novembre + Dicembre + Man mano che il suono accelera, la distanza è più vicina. + Radar + Modifica zona WiFi + NOME WI-FI + Zona sicura + + aggiungi nuovo + Zona vietata + Nessuna zona aggiunta, ancora + Aggiungi zona sicura + Modifica zona sicura + Nome recinto + Nome zona + Aggiungi zona vietata + Modifica zona vietata + Scheda dati + ore + Obiettivo giornaliero + Fantastico! Pronti per iniziare! km - Daily Avg. activity time - Avg. Calories - Daily Avg Resting time + Tempo medio giornaliero di attività + Calorie medie + + Tempo medio giornaliero di riposo Profilo lb - in - Type - Sex - Dog - Cat - Other + poll. + Tipologia + Sesso + Cagnolo + Gatto + Altro kg cm - Members - Active - Pending - Choose avatar - Unlock New Milestones! - Congratulations! - Share - Log in + Soci + Attivo + In sospeso + Scegli Avatar + Sblocca nuovi traguardi! + Complimenti! + Condividi + Accedi Inizia - Create account - Minimum 6 characters - Country - Email Address - Continue - OTP verification + Crea account + Almeno 6 caratteri + Nazione + Indirizzo e-mail + Continua + Verifica OTP sec - Resend Code - Create new password - Reset Now - Confirm Password - Password reset successful! + Invia di nuovo il codice + Crea nuova password + Reimposta + Confermi la password + Password reimpostata correttamente! Standard - Satellite - Display Fences - Select - Always By Your Side! - Powered by - View Less - See All - Adventure - New Tracker - Add new tracker - Charge and Power On - Step 1 : - Charge the tracker, 3 white lights flash, then red stays on. - Unplug cable; slow green blinking indicates device is on. - Step 2 : - Searching for Tracker - Bring the phone close to the tracker. - Pair with Tracker - ID number + Satellitare + Mostra recinzioni + Seleziona + Sempre al tuo fianco + Supportato da + Visualizza meno + Vedi tutto + Avventura + Nuovo tracker + Aggiungi nuovo tracker + Carica e Accensione + Passaggio 1: + Caricare il tracker, 3 luci bianche lampeggiano, quindi il rosso rimane acceso. + Scollegare il cavo; il lampeggio verde lento indica che il dispositivo è acceso. + Fase 2: + Ricerca del tracker + Avvicinare il telefono al tracker. + Abbina a Tracker + numero documento No - Input ID for Pairing - Add Tracker - Choose Your Plan - Benefits - Monthly Subscription - /month - /year - Best Value - Confirm Your Plan - Device Number - Terms and Conditions - Summary - Tax - Payment Method - My Card - No Payment Method - + Add New Card - Primary - Make Payment - We will redirect to paypal - Add Payment Method - Save New Card - Payment was Successful - Accepted Payment Cards - Set as primary Card - Name On Card - Permissions - Skip - - - Grant permissions for better experience. - Tracker ID - Plan: - Renews On: - Adding where they live can improve battery and provide extra safety - Establish WiFi Zone - Permanent residence saves power, enhances positioning. - Permanent Residence - Choose Wi-Fi network - Later - Notifications Setting - Enter or leave Safe Zone/No-go Zone - Tracker Status - Subscription/Battery Warnings/Power Off - Active/sleep reminder/goal achievement - About WiFi Zone - Choose a network in a trusted space where your spents lots of time. Like your home. Once in range, your tracker will recognize this network as a WiFi Zone. - Office - Save Power - With Bluetooth range? Pinpoint a nearby tracker using Radar. Live will also become available, but using it will end power saving. - Tracking your pet - WiFi Zone Settings - Please enter your feedback - Enter Your Email Address - Choose File - Power Off - What is your pet type? - What is your pet name? - Current LED - Left the safe zone - In the WiFi Zone - In the no-go zone - Strong signal - WiFi Zone - Deactivate - Please use a valid email address. - Please enter a full name. - Please use a valid password. - Please select a region. - To ABBIDOT - Entered passwords differ! - No Member, yet - Invite Members - Home - Live Duration - About Live Duration - Live Mode helps find pets with location updates every 2~3 seconds, but uses more battery. You’ll still get regular updates with default tracking. - Live Tracking will stop at the end of the set duration, but you can stop it before to save battery. - Keep it short - GPS Location - Receive Notifications - Turn ON - Device not activated. Subscribe to activate. - Keep tracker on and nearby to scan. - Outside - Inside - You have created too many fences - LIVE has ended. LIVE time can set through Live Duration. - Tracker power off - Starting Live… - Connecting to network - GPS positioning - Starting + ID input per l\'accoppiamento + Aggiungi tracker + Scegli il tuo piano + Vantaggi + Abbonamento mensile + /mese + /anno + Miglior Valore + Conferma il tuo + Numero dispositivo + Termini e condizioni + Riepilogo + Imposte + Metodo di pagamento + La mia scheda + Nessun metodo di pagamento + Aggiungi Nuova Carta + Primario + Effettua un pagamento + Reindirizzeremo a paypal + Aggiungi metodo di pagamento + Salva nuova carta + Il pagamento è avvenuto con successo + Carte di pagamento accettate + Imposta come primario + Nome del titolare + Permessi + Salta + Concedi le autorizzazioni per un\'esperienza migliore. + ID tracker + Piano terapeutico: + Rinnova Il + Aggiungere dove vivono può migliorare la batteria e fornire maggiore sicurezza + Stabilisci una zona WiFi + La residenza permanente consente di risparmiare energia, migliora il posizionamento. + Residenza permanente + Scegli la rete Wi-Fi + Dopo + Impostazione delle notifiche + Entrare o uscire dalla zona sicura/no-go zone + Stato del tracker + Abbonamento/Avvertenze batteria/Spegnimento + Promemoria attivo/sonno/raggiungimento degli obiettivi + Informazioni su WiFi Zone + Scegli una rete in uno spazio affidabile in cui trascorri molto tempo. Come la tua casa. Una volta nel raggio d\'azione, il tuo tracker riconoscerà questa rete come una zona WiFi. + Ufficio + Risparmio energia + Con portata Bluetooth? Individua un localizzatore nelle vicinanze utilizzando Radar. Anche Live sarà disponibile, ma il suo utilizzo metterà fine al risparmio energetico. + TRACCIAMENTO ATTIVITA\' + Impostazioni zona WiFi + Inserisci il tuo feedback + Inserisci il tuo indirizzo Email + Scegli file + Pulsante di accensione disattivo (OFF) + Qual è il tuo tipo di animale domestico? + Come ti chiami? + LED CORRENTE + Ha lasciato la zona sicura + Nella zona WiFi + Nella no-go zone + Forte segnale + Zona WiFi + Disattiva + Inserisci un indirizzo e-mail valido. + Scrivi il nome completo + Utilizza una password valida. + Seleziona una regione. + A ABBIDOT + Le password inserite differiscono! + Ancora nessun membro + Invita membri + Homepage + Durata in tempo reale + Informazioni sulla durata live + La modalità Live aiuta a trovare gli animali domestici con aggiornamenti della posizione ogni 2~3 secondi, ma utilizza più batteria. Riceverai comunque aggiornamenti regolari con il monitoraggio predefinito. + Il Live Tracking si interromperà alla fine della durata impostata, ma è possibile interromperlo prima per risparmiare batteria. + Sii conciso + Posizione GPS + Ricevi notifiche + Accensione + Dispositivo non attivato. Abbonati per attivare. + Tieni il tracker acceso e nelle vicinanze per eseguire la scansione. + Esterno + Interno + Hai creato troppe recinzioni + LA DIRETTA È terminata. IL tempo IN DIRETTA può essere impostato tramite la Durata in diretta. + Spegnimento del tracker + Avvio Live in corso... + Collegamento alla rete... + posizionamento GPS. + Avviamento -min Live - Timeout, please try again - Close - About Live - Live Tracking will stop in one hour, but you can stop it before to save battery. - Resting - Resting time - No signal + Si è verificato un timeout, riprovare. + Chiudi + Informazioni su Live + Il Live Tracking si interromperà tra un\'ora, ma puoi interromperlo prima per risparmiare batteria. + Riposando + TEMPO DI RIPOSO + Nessun segnale WiFi - Select measurement unit - Metric(cm, kg) - Imperial(in, lb) + Seleziona unità di misura + Metrico (cm, kg) + Imperiale(in, lb) m - ft - Fences Alerts - My Pet Fence - Your feedback helps us get better. - Type Message - Please continue to verify your email - Code valid for - Create password - Change Email successful! - Change Email - Enter new email - Keep the app running in the background to receive tracker status notifications. - Reminder - Yesterday - Power On/Off - Charge and unplug to turn on \nFlashing green light = on - 1. Choose a subscription \n2. Tap to activate the tracker \n3. Enable GPS and cellular tracking - Active Tracker - (The GPS and cellular network conditions can vary depending on the environment. Before placing it on your pet, check various locations around you to evaluate the GPS and network status.) - Check Tracker Status - When the Tracker detects no movement for 15 minutes, it turns off GPS and cellular networks, entering sleep mode automatically. Upon detecting movement, the Tracker activates and resumes normal operation. - Connect the tracker to home WiFi (no password required). In the WiFi Zone, GPS activation is disabled. It connects to the network every 10–60 minutes, with very low power consumption. - When your tracker is outside the WiFi Zone, it activates GPS and connects to the network every 3/5/10/15 minutes. - Tracker Battery Life - Choose location and adjust radius or shapeSave fence to activate it - Alerts when pet enters or leaves the zone - Create a Pet Fence - Tracker in Sleeping Mode - (Super Low power usage) - Tracker in WiFi Zone - Tracker outside WiFi Zone - (Low power usage) - (Standard power usage) - (The highest power usage) - Choose the right GPS update interval - Tracker in Live Mode - Fresh Paws - Day 1 Devotee - Newbie Navigator - Furry Friend + piedi + Avvisi recinzioni + Il mio recinto per animali domestici + Il tuo feedback ci aiuta a migliorare. + Inserisci Messaggio + Continua a verificare la tua email + Codice valido per + Crea password + Modifica e-mail riuscita! + Cambia e-mail + Inserisci la tua nuova email + Mantieni l\'app in esecuzione in background per ricevere notifiche sullo stato del tracker. + Promemoria + Ieri + Accensione/spegnimento + Carica e scollega per accendere \nLuce verde lampeggiante = accesa + 1. Scegli un abbonamento \n2. Tocca per attivare il tracker \n3. Abilita GPS e tracciamento cellulare + Tracker attivo + (Le condizioni del GPS e della rete cellulare possono variare a seconda dell\'ambiente. Prima di posizionarlo sul tuo animale domestico, controlla le varie posizioni intorno a te per valutare lo stato del GPS e della rete.) + Controlla lo stato del tracker + Quando il Tracker non rileva alcun movimento per 15 minuti, spegne il GPS e le reti cellulari, entrando automaticamente in modalità sleep. Al rilevamento del movimento, il Tracker si attiva e riprende il normale funzionamento. + Collegare il tracker al WiFi di casa (non è richiesta alcuna password). Nella Zona WiFi, l\'attivazione del GPS è disabilitata. Si connette alla rete ogni 10–60 minuti, con un consumo energetico molto basso. + Quando il tuo tracker è al di fuori della Zona WiFi, attiva il GPS e si connette alla rete ogni 3/5/10/15 minuti. + Durata della batteria del tracker + Scegli la posizione e regola il raggio o la formaSalva la recinzione per attivarla + Avvisa quando il PET entra o esce dalla zona + Crea una recinzione per animali domestici + Tracker in modalità Sleeping + (Basso consumo energetico) + Tracker nella zona WiFi + Tracker al di fuori della zona WiFi + Basso consumo di potenza + (Consumo energetico standard) + (Massima potenza assorbita) + Scegli il giusto intervallo di aggiornamento GPS + Tracker in modalità Live + Zampe fresche + Devoto del 1° giorno + Navigatore per principianti + Pelosetto 8 Pawtential Pal - Month Mate + Mese Mate Tailwag Explorer Pawsome Partner - 1 Year Hugger - Purrfect Partner - 2 Year Companion - Faithful Friend - 3 Year Harmony - Furr-timer Friend - Welcome to the community! Start your journey with your first badge. - You\’ve just started! Your dedication on the first day is noted. - Log in for a day to earn this badge! - You\’re finding your way around. Keep exploring to reach new milestones! - Continue exploring for three days to achieve this milestone! - A week in, and you\’re already becoming a part of our furry family! - Stay active for a week to earn the Furry Friend badge! - You\’re showing great potential! Keep up the good work. - Keep engaging for fifteen days to unlock this badge! - One month in and you\’re a valued member of our community! - Be a part of our community for a month to achieve this badge! - Three months of exploration and adventure—well done! - Explore with us for three months to earn the Tailwag Explorer badge! - Six months of fantastic partnership. Thanks for sticking with us! - Stick around for six months to earn the Pawsome Partner badge! - A whole year of dedication! Here\’s to many more! - Continue with us for a year to achieve this milestone! - Eighteen months and still going strong. You\’re truly purrfect! - Stay engaged for eighteen months to earn the Purrfect Partner badge! - Two years with us—your loyalty is greatly appreciated! - Complete two years with us to receive the 2 Year Companion badge! - Thirty months of faithful companionship. You\’re a treasured friend! - Remain a faithful friend for thirty months to earn this badge! - Three years together in perfect harmony. Thank you for being with us! - Three years of harmony with us will earn you this badge! - Five years of wonderful friendship. Your commitment is truly inspiring! - Five years of commitment will unlock the Furr-timer Friend badge! - How to get? - Family Invitation - Active Time: - Expires On: - Expired on: - YEARS - MONTHS - DAYS - Subscription Order - Order ID: - Enter your reason for the refund - Request a refund - Refund - Waiting - Refunding - Refunded - /year on - /month on - Annual Care - Annual Care: - LED Light Settings - When the tracker is next to your phone, it is recommended to connect to the tracker via Bluetooth and adjust the LED settings. The changes will take effect immediately. - Bluetooth Setup - When the tracker is not near your phone, you can set the LED lights remotely via the network. In this case, it usually takes a few minutes for the settings to take effect. - Sorry, duplicate WiFi not allowed - Network Setup - Set accurate weight to improve calorie accuracy. - Enable Auto-Renew - About Weight - Order - Set Premium - Basic + Abbracciatore di 1 anno + Partner Purrfect + Compagno di 2 anni + Amico fedele + Armonia di 3 anni + Amico Furr-timer + Benvenuto nella community! Inizia il tuo viaggio con il tuo primo badge. + Hai appena iniziato! Si prende nota della tua dedizione il primo giorno. + Accedi per un giorno per ottenere questo badge! + Stai trovando la tua strada. Continua a esplorare per raggiungere nuovi traguardi! + Continua a esplorare per tre giorni per raggiungere questo traguardo! + Dopo una settimana, stai già entrando a far parte della nostra famiglia pelosa! + Rimani attivo per una settimana per ottenere il badge Furry Friend! + Stai mostrando un grande potenziale! Continua così. + Continua a impegnarti per quindici giorni per sbloccare questo distintivo! + Dopo un mese sei un prezioso membro della nostra community! + Entra a far parte della nostra community per un mese per ottenere questo distintivo! + Tre mesi di esplorazione e avventura, ben fatto! + Esplora con noi per tre mesi per ottenere il badge Tailwag Explorer! + Sei mesi di fantastica collaborazione. Grazie per essere rimasto con noi! + Rimani nei paraggi per sei mesi per ottenere il distintivo Pawsome Partner! + Un anno intero di dedizione! Brindiamo a molti altri! + Continua con noi per un anno per raggiungere questo traguardo! + Diciotto mesi e va ancora forte. Sei davvero perfetta! + Resta impegnato per diciotto mesi per ottenere il badge Purrfect Partner! + Due anni con noi: la tua fedeltà è molto apprezzata! + Completa due anni con noi per ricevere il badge Compagno di 2 anni! + Trenta mesi di fedele compagnia. Sei un amico prezioso! + Rimani un amico fedele per trenta mesi per ottenere questo distintivo! + Tre anni insieme in perfetta armonia. Grazie per essere stati con noi! + Tre anni di armonia con noi ti faranno guadagnare questo distintivo! + Cinque anni di meravigliosa amicizia. Il tuo impegno è davvero stimolante! + Cinque anni di impegno sbloccheranno il badge Furr-timer Friend! + Come Arrivare + Invito di famiglia + Tempo attivazione + Scade il: + Scade il: + ANNI + MESI + GIORNI + Nuovo ordine di abbonamento + ID: + Immetti causale rimborso + Richiedi un rimborso + Rimborso + Attendi + Rimborso + Rimborsato + /anno in data + /mese il + Assistenza annuale + Cura annuale: + Configurazione luce + Quando il tracker è accanto al telefono, si consiglia di connettersi al tracker tramite Bluetooth e regolare le impostazioni del LED. Le modifiche avranno effetto immediato. + Configurazione Bluetooth + Quando il tracker non è vicino al telefono, è possibile impostare le luci a LED da remoto tramite la rete. In questo caso, di solito ci vogliono alcuni minuti perché le impostazioni abbiano effetto. + Spiacenti, non è possibile duplicare il WiFi + Configurazione della rete + Imposta un peso preciso per migliorare la precisione calorica. + Attivare il rinnovo automatico + Informazioni sul peso + Ordine + Imposta Premium + Elementare Premium - Rejected - Expired - Upgrade Your Plan - Residual Value - Track and train pets to prevent loss or danger. - Advanced Setting - Delete Account - Change Name - Your Email Address: - Change Now - Upgrade Now - Activity Time - Not Set - Done - Weather to save? - Connect - Skip password - Connecting - Incorrect password, please try again. - Your view access has ended. - As long as your tracker detects your buddy is safe and sound in a Power Saving Zone, it will keep LIVE Tracking, Light and Sound off to extend battery life. - About Tracking Duration - Will be Deleted - LED Light Setting - Reserve - Subscription Plan - Connecting Tracker - Annual Care included, non-adjustable - Delete successfully - Sure to delete this card? - Account exists. Log in now? - Selected date is out of range - Shake to turn on \nFlashing green light confirms on - GPS and cellular signals may vary by location. \nTest in different locations before use. - Tracker is on charging - Subscribed - Baidu Maps - Send - To turn on, connect the power cable. After first-time startup, shake to turn on. - As low as - Payment Manager - Basic Plan - Premium Plan - Activate Subscription - Charging - Total Time - Live works on cellular only - Unbind Device - Edit Profile - No internet connection - System Error: Please try again later. - Missing Parameters. - Tracker Busy. Please wait and retry. - Tracker Offline. Unable to proceed. - Live stream in progress. Settings unavailable. - Operation failed. Please try again. - Tone - Locate works on cellular only - Pet is close, try Radar - Fully charged - Timeline - Keep phone close to device - Auto-Renew: Cancel - Display Dashed Line - First use - Daily use - Sleep Mode - 1. 15 minutes no movement → sleep mode. \n2. Auto wake on movement. \n3. Battery updates every 24 hours. - WiFi Zone(Home) - 1. Connect to home WiFi. \n2. GPS off → save battery. \n3. Update every ~60 minutes. - 1. Select 3–15 min. \n2. Short interval = higher battery use. \n3. Default: 5 min. - Set Fence type - Safe Zone or No-go Zone - Set boundary - Enable alerts in Account > Settings > Notifications - Edit or delete fence in Manage - Initializing Device - Add Wi-Fi zone to prolong care time - Add - Already at minimum size - Login with - My Card - Edit Payment Method - Your phone number has already been bound - Go to - Pet > Tracker - Pet > Tracker > GPS Update - Pet > My Pet Fence > Manage > + Add New - Check: - · Network\n· WiFi Zone\n· GPS - · Bluetooth\n· Battery\n· LED - Privacy Policy - Expires On - Google Map - Upgrade successful - Upgrade failed - Please enter email address. - Enter Tracker ID - No signal. Check if pet indoors. - Recommenced - Expiry Time: + Rifiutato + scaduta + Aggiorna il tuo piano + Valore Residuo + Tracciare e addestrare gli animali domestici per evitare perdite o pericoli. + Impostazioni avanzate + Elimina account + Cambia nome + Il tuo indirizzo email: + Modifica ora + Aggiorna ora + Durata dell\'evento + Non Impostato + Fine + Salvare il meteo? + Connettiti + Salta Password + Connessione in corso... + %1 (Parziale) + Il tuo accesso alle visualizzazioni è terminato. + Finché il tuo tracker rileva che il tuo amico è sano e salvo in una zona di risparmio energetico, manterrà il monitoraggio in TEMPO REALE, la luce e il suono spenti per prolungare la durata della batteria. + Informazioni sulla durata del monitoraggio + Sarà/saranno cancellato/i + Impostazioni luce + Prenota + Piano di Abbonamento + Collegamento del tracker + Assistenza annuale inclusa, non regolabile + Iscritto + Mappe Baidu + Invia + Eliminato con successo + Sei sicuro di voler eliminare questa carta? + L\'account esiste. Accedere ora? + La data selezionata non è compresa nell\'intervallo + Agita per accendere \n La luce verde lampeggiante conferma l\'accensione + I segnali GPS e cellulari possono variare in base alla posizione. \nEffettuare il test in luoghi diversi prima dell\'uso. + Il tracker è in carica + Per accendere, collegare il cavo di alimentazione. Dopo il primo avvio, agitare per accendere. + A partire da + Gestore pagamenti + Piano di base + Piano Premium + Attiva abbonamento + Carica + Tempo Totale + Live funziona solo su cellulare + Scollega dispositivo + Modifica profilo + Nessuna connessione Internet + ERRORE DI SISTEMA TIBCO. Riprova più tardi + Parametri mancanti + Tracker occupato. Attendi e riprova. + Tracker offline. Impossibile procedere. + Streaming live in corso. Impostazioni non disponibili. + "Operazione non riuscita, riprova", + Tono + Individua lavori solo su cellulare + L\'animale domestico è vicino, prova Radar + Carica piena + Sequenza temporale + Tieni il telefono vicino al dispositivo + Rinnovo automatico: Annulla + Visualizza linea tratteggiata + Messa in servizio + Uso quotidiano. + Modalità di sospensione + 1. 15 minuti in modalità di → sospensione senza movimento. \n2. Riattivazione automatica al movimento. \n3. La batteria si aggiorna ogni 24 ore. + Zona WiFi (Home) + 1. Connettiti al WiFi di casa. \n2. GPS spento → per risparmiare batteria. \n3. Aggiorna ogni ~60 minuti. + 1. Seleziona 3–15 min. \n2. Intervallo breve = maggiore utilizzo della batteria. \n3. Predefinito: 5 min. + Imposta tipo di recinzione + Zona sicura o no-go zone + Imposta limite + Abilita gli avvisi in Account > Impostazioni > Notifiche + Modifica o elimina recinzione in Gestisci + Inizializzazione del dispositivo + Aggiungi una zona Wi-Fi per prolungare il tempo di cura + Aggiungi + Già alle dimensioni minime + Accedi (Login) con + La mia scheda + Modifica Metodo di Pagamento + Il tuo numero di telefono è già stato associato + Andare su + PET > Tracker + PET > Tracker > Aggiornamento GPS + Pet > Il mio recinto per animali > Gestisci > + Aggiungi nuovo + Verificare: + · Rete\n· Zona WiFi \n· GPS + · Bluetooth\n· Batteria\n· LED + Scaduto il + Google Maps + Aggiornamento riuscito + Miglioramento non riuscito + Inserisci l\'indirizzo e-mail + Inserisci l\'ID del tracker + Nessun segnale. Controllare se l\'animale domestico è al chiuso. + Consigliato + Tempo di scadenza: terms_it.html privacy_it.html subscription_terms_conditions_it.html - - Non hai ricevuto l\’e-mail? + Rimuovi metodo di pagamento + Sei sicuro di voler rimuovere questo metodo di pagamento? + Disattiva il rinnovo automatico prima di rimuovere il metodo di pagamento. + Il rinnovo automatico è attivo + Rimuovi + Disattiva e rimuovi + Informativa sulla privacy + Non hai ricevuto l’e-mail? %d anno %d/100 ottenuti Ultima volta: %s - Mostra percorso e punto + Mostra percorso & punto Sei sicuro di voler condividere i dati dell\'animale con \' %s \'? Seleziona 2 \~ 9 foto Rinnova a %.2f all\'anno successivamente, annulla in qualsiasi momento $%doff già Il piano di abbonamento è attivo fino a %s Il rinnovo automatico è disattivato e il piano di abbonamento non sarà disponibile dopo %s - Salva e conferma + Salva & conferma $%s/mese Hai configurato correttamente il tuo animale domestico e hai \neparato il badge di sicurezza! Dispositivo già associato, verifica \ne riprova %s piedi %s mph Sei sicuro di voler eliminare la famiglia %s? - 4. Attiva le notifiche: vai su &#39;Account&#39; &gt; &#39;Impostazioni&#39;. Fai clic su &#39;Notifiche&#39; e attiva + 4. Attiva le notifiche: vai su \'Account\' > \'Impostazioni\'. Fai clic su \'Notifiche\' e attiva /mese x%s /%s anno A partire da %s @@ -695,14 +696,14 @@ Lingua Esci Per favore, seleziona un tipo di domanda - Genere. + Genere Località Telefono Razza Attiva il dispositivo per continuare. Attiva Tracker - Strumento di monitoraggio delle squadre + Il mio tracker Autorizzato Recinto Impostazione @@ -726,7 +727,7 @@ miglio kcal Il tuo dispositivo è scaduto, rinnovalo - Caricamento mappa in corso... + Caricamento mappa… Ciao, frammento vuoto Foto e Video Seleziona @@ -746,7 +747,7 @@ Data Doppio click per modificare Personalizza - <g id="1">Selezione foto:</g> + Selezione foto: GIF Aggiungi Nuova Carta Pagamento @@ -776,7 +777,7 @@ Nome Cognome Informazioni legali - Ho letto ed approvo la Privacy Policy + Accetto Rifiuto Scarica l\’indirizzo Attendi... @@ -813,7 +814,7 @@ Abilita Annui) Finché il tuo tracker rileva che il tuo amico è sano e salvo in una zona WiFi, manterrà il monitoraggio in tempo REALE, la luce e il suono spenti per prolungare la durata della batteria. - Invitare + +Invitare Questo eliminerà tutti dati in modo permanente dal tuo account. Bluetooth @@ -821,7 +822,7 @@ Media 7 giorni Segnale GPS debole Nessun segnale di rete - TEMPO DI RIPOSO + Tempo di riposo km/h mph Un Suo/a amico/a @@ -837,18 +838,24 @@ Visualizza tutto Immetti un numero di telefono valido Account - 1. Protezione flessibile a breve termine\n\n2. Garanzia di rimborso di 30 giorni - 1. Assistenza clienti dedicata\n\n2. Copertura annuale di protezione\n\n3. Garanzia di rimborso di 30 giorni - 1. Sostituzione gratuita del dispositivo inclusa (1x)\n\n2. Protezione migliorata\n\n3. Protezione per animali domestici senza problemi\n\n4. Garanzia di rimborso di 30 giorni + 1. Protezione flessibile a breve termine +\n2. Garanzia di rimborso di 30 giorni + 1. Assistenza clienti dedicata +\n2. Copertura annuale di protezione +\n3. Garanzia di rimborso di 30 giorni + 1. Sostituzione gratuita del dispositivo inclusa (1x) +\n2. Protezione migliorata +\n3. Protezione per animali domestici senza problemi +\n4. Garanzia di rimborso di 30 giorni Copyright © %d ABBIDOT Tutti i diritti riservati Inseguitori %d %d Animali domestici - %d in + %d pollici Impossibile ottenere l\'autorizzazione - ANIMALI NON AMMESSI + Senza animali Si prega di legare prima un animale domestico %d%% - %dY %dMon + %dY %dlun Tutti i video Completo(%1$d/%2$d) Supporta fino a %d foto o video @@ -859,7 +866,7 @@ Consenti le autorizzazioni pertinenti %1$d/%2$d Oggi\t%s - 视频模式选择。 + Selezione video $\t%.2f %s%% Inserisci l\'indirizzo e-mail registrato nel tuo profilo.\nInvieremo un codice di 4 cifre alla tua e-mail. @@ -887,5 +894,5 @@ (Rinnovare a $%s/%s mesi successivi) Rinnovo: $%s/%s anni su %s Rinnovo: $%s/%s mesi su %s - Sessione scaduta. Accedi di nuovo + La sessione di accesso è scaduta. Accedi di nuovo \ 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 650f058..51e73b2 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -942,4 +942,10 @@ privacy_zh.html subscription_terms_conditions_zh.html 登录信息失效,请重新登录 + 移除支付方式 + 确定要移除该支付方式吗? + 移除支付方式前,请先关闭自动续订。 + 自动续订已开启 + 移除 + 关闭并移除 \ 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 004b82e..bbb9a6d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -993,4 +993,10 @@ privacy_en.html subscription_terms_conditions_en.html Login session expired. Please log in again + Remove Payment Method + Are you sure you want to remove this payment method? + Please turn off auto-renewal before removing your payment method. + Auto-Renewal Is On + Remove + Turn Off & Remove \ No newline at end of file diff --git a/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt b/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt index d79017b..4ce5581 100644 --- a/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt +++ b/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt @@ -94,7 +94,7 @@ class AppUtils { * 是否是国内 */ fun isChina(type: String = SWITCH_PAGE_TYPE): Boolean { - return true + return false if (isDebug()) { if (type == SWITCH_MAP_TYPE && MMKVUtil.getBoolean(MMKVKey.OnlyGoogleMap, false)) { //只启用谷歌地图