diff --git a/app/build.gradle b/app/build.gradle index fe9ce5b..a0960c3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,7 @@ android { targetSdkVersion 35 versionCode 2300 // versionName "2.3.0" - versionName "2.3.0-Beta1" + versionName "2.3.0-Beta2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -72,10 +72,10 @@ android { //解决mapBox和百度地图libc++_shared.so发生冲突http://www.52im.net/blog-28523-2848.html packagingOptions { - pickFirst 'lib/x86/libc++_shared.so' pickFirst 'lib/x86_64/libc++_shared.so' - pickFirst 'lib/armeabi-v7a/libc++_shared.so' pickFirst 'lib/arm64-v8a/libc++_shared.so' + pickFirst 'lib/x86/libc++_shared.so' + pickFirst 'lib/armeabi-v7a/libc++_shared.so' pickFirst 'lib/armeabi/libc++_shared.so' pickFirst 'lib/mips/libc++_shared.so' pickFirst 'lib/mips64/libc++_shared.so' diff --git a/app/src/main/assets/privacy_cn.html b/app/src/main/assets/privacy_cn.html deleted file mode 100644 index 886b6a9..0000000 --- a/app/src/main/assets/privacy_cn.html +++ /dev/null @@ -1,469 +0,0 @@ -
- -

˽ܶƼ޹˾ļΪܶƼ򡰱˾ǡ)öַʽռʹͨƽ̨ύûϢͣݣƷɼûϢͣݡܶƼȷϸİȫܱ׼ûͬ⣬ܶƼй¶κθϢͣϣĵ3СȨ⡣

- -

˾ǿҽûϸĶ˽Ա˽Ȿ˾ûܶƼƽ̨ṩĸϢݼʹܶƼƷϱϢͣݵߺʵӦá˽עͷעûҵΪҪʱɲڸ¡޶ݡĺİ汾һЧûԱ˽κʻǣµܶƼѯ绰0755-86352225

- -

Ա˽ߵ飬ֹͣʹܶƼķͲƷʹܶƼķͲƷʾܱ˽и˽߹ɡʹһֲԼ

- -

ܶƼȨκʱ޸ı˽ߣڹ֮ʱЧ

- -

һռϢͣ

- -

(1ܶƼռ洢κûṩǻʹõϢͣݡõϢͣݿܰڣûʹܶƼƷύФԱաߡءֻ롢ַʵַϵϢ罻ýϢЧ֤ͼͥԱϵȸϣԼп֧ƽ̨ϣҪ

- -

(2ܶƼԶռ洢ûǽлʹǵķͲƷʱϢͣݡûʹܶƼͲƷܱɼģӲϢϵͳ͡豸ʶ IP ַ MAC ַ GPS λáݡ˶ݡΪƫáճݡ֡ͼƬӰϢͣݡ

- -

(3ܶƼվý塢ƽ̨ƶӦԼƷ񣨡)ӻͨܶƼƽ̨ͲƷ΢šԱȣлϢͣݶܱռǿܽͨܶƼƽ̨ṩǵĻռϢͣݽϣܰڣܶƼ̡ƷӦóϢͣݡϢͣݽᱻΪϣֻҪϱֹ״̬

- -

(4ͬңܶضƽ̨Ӧƣϸڹңع涨δ18֤꣬ȡ໤˵ͬʹܶƼķͲƷͬⱾ˽ߡ

- -

ʹϢͣ

- -

ܶƼȷϸİȫܱ׼Ϸʹռ洢ϢͣݣϢͣݿܱʹڣ

- -

(1ΪṩܶƼķͲƷ(2ĽάܶƼķͲƷ飬ڷûΪơ

- -

(3)ܶƼķ񡢲ƷͻԼĿйͨ

- -

(4ɣṩƷʾϢ

- -

(5ͳϢͣݲͲƷʹԹ˾˾뱾˾ֱӻӿƹϵشӰϵҵڲʹá

- -

Ȩ

- -

һ˵ΪҪάֺ͸ܶƼķͲƷὫϢͣṩܶƼ˾ڲԱԱΪûṩȻ£ǿܻὫϢͣݴݸ

- -

(1ڱܵ£ǿܻὫϢͣ¶ͣתκα˾ȨĵӦ̻ⲿӦ̣ԴٽṩķһЩ˾ڵҺй֮Ĺң֪Ϥͬ⣬ݱɿܲŷˡһݱ

- -

(2ǿܽϢܶƼķṩԱ㿪չǵҵ񣬵Ϣͣ¶ͣתܶƼȨκδ˻˾˾ȨʹøõϺͣݡǽɷ书ĸϢͣݣҲΪĿĶʹá

- -

(3ǿܻйϽȨ˾ŵշҪΪִǵ߻Ϊǻ˵ȨƲͣȫ¶ϢͣݡǿܹϢֹͣǷʹܶƼķͲƷΥʹΪԵϽзɿ硣

- -

(4ǿǽзթϢռ͵ְȨ˾عϢ˾򡢷ԺϵķɳбҪṩ

- -

(5ͨܶƼͲƷռĸϢͣݿܶƼ˾֮תƻ򴢴档ʹܶƼķͲƷΪͬⲢȨܶƼ¶תĸϢͣݡ

- -

(6ϢΪܶƼȫ򲿷ʲۡתáתǽͨʾ֪ͨͨŷ֪ͨ

- -

ġϢͣ

- -

(1ʹܶƼضķʱͬ⹫һЩϢܰûڳкͷͼƬ

- -

(2ͬ⹲ϢͣݣҪ˽á

- -

(3ѡϢͣͨܶƼƽ̨ƽ̨Ķƽ̨˽ߣǶƽ̨ϢͣݵİȫԲκΡ

- -

(4ͬdzƹ㱾˾ƷĿĿܻʹϢͣݡ

- -

塢Ϣͣ

- -

(1ϢͣݵİȫǷdzҪܶƼȷĸϢͣδȨĽӴʹöֱʩ֤ܺϢͣݰȫ

- -

(2ѭϵҵ׼ϢͣݰȫȻڻ͵Ӵ洢ԣ޷֤ṩϢͣݰٷٰ֮ȫܡ

- -

(3ͨرضϢͨѶʽϿӡرնλܵȣֹֹϢͣݵϴ˿ܵ޷ʹܶƼķͲƷǵһЩ͹ܿ޷

- -

(4Ʊ˻¼ϢȨͣתʹ˻(5˾߽ײõ֧ƽ̨Դٽӽ׵

- -

(6ͨ¼ܶƼӦóĻɾIJϢͣϣǰϢȻǹɼġ

- -

(7ͨܶƼ˻κκǷ񾭹ͬ⡣÷޶ڣܶƼκλδȨʹ˻Ϣͣй¶Ϊ

- -

(8סκιңͬǽϢͣתơʹܶƼݿܶƼݱ˽ռʹϢͣݡݷɹ涨ĸϢͣݽܶƼطͣúֱûʽҪǴݿɾϢͣݻֹܶƼӦóûʸ

- -

ṩ񹤾߰ơSDK

- -

Bugly(ѶBugly)

-

ܣ Ϊ˿ٶλӦòƷ⻹ԭCrashCrash豸ͳ

-

ռϢͣCrashCrashϢ̶߳ջROM/RAM/SD/Ե״̬AppϢ汾豸ϢIMEI豸ʶ

- -

˽ӣhttps://privacy.qq.com/document/preview/fc748b3d96224fdb825ea79e132c1a56

- - -

ٶȶλ

-

ܣ ʵֶλܣ

-

ռϢͣ豸ʶϢAndroid IDIDFAIDFVγϢϵͳϢϵͳ汾豸ƷƼͺš豸ãӦϢӦ

-

˽ӣhttps://lbs.baidu.com/index.php?title=openprivacy#service-page-anchor-0-0

- - -

ٶȵͼ

-

ܣ ڵͼʾ켣

-

ռϢͣ豸ʶϢAndroid IDIDFAIDFVγϢдֻô洢Ϣ

-

˽ӣhttps://lbs.baidu.com/index.php?title=openprivacy#service-page-anchor-0-1

- - -

QQ

-

ܣ QQȨ¼ͷ

-

ռϢͣ豸ʶϢAndroid IDIDFAIDFVϵͳϢڴ濨Ȩ޺ӦбϢ

-

˽ӣhttps://wiki.connect.qq.com/qq%e4%ba%92%e8%81%94sdk%e9%9a%90%e7%a7%81%e4%bf%9d%e6%8a%a4%e5%a3%b0%e6%98%8e

- - -

΢

-

ܣ ΢Ȩ¼ͷ

-

ռϢͣ豸ʶϢAndroid IDIDFAIDFVϵͳϢڴ濨Ȩ޺ӦбϢ

- -

˽ӣhttps://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8

- - -

mapbox

-

ܣ λ·߹滮

-

ռϢͣ豸ʶϢAndroid IDIDFAIDFVϵͳϢڴ濨Ȩ,γϢ

-

˽ӣhttps://www.mapbox.com/legal/privacy

- - -

ͳơ

-

ܣȡû豸ΨһʶûϢ

- -

ռϢͣ豸ʶϢAndroid IDIMEIIDFAIDFV豸MACַϵͳϢѰװAPPϢдֻô洢Ϣ

-

˽ӣhttps://www.jiguang.cn/license/privacy

- - -

ߡ

- -

ʹǵķͲƷԼɴ˲κ飬ܱ˽ԼʹԼ涨ʹܶƼͲƷĹ

- - -

лĶκʣµܶƼѯ绰0755-86352225

- - - - - -
\ No newline at end of file diff --git a/app/src/main/assets/privacy_de.html b/app/src/main/assets/privacy_de.html new file mode 100644 index 0000000..96f8d4e --- /dev/null +++ b/app/src/main/assets/privacy_de.html @@ -0,0 +1,71 @@ + + +
+

Bei ABBI PET INC respektieren wir Ihre Privatsphäre und verpflichten uns, diese zu schützen. Diese Datenschutzerklärung beschreibt, wie wir Ihre Informationen erfassen, verwenden, schützen und vertraulich behandeln, wenn Sie unsere mobile App („App“) verwenden.

+ +

1. Informationen, die wir erfassen

+ + + +

2. Wie wir Ihre Informationen verwenden

+ + + +

3. Datengeheimhaltung und Sicherheit

+ +

4. Weitergabe Ihrer Informationen

+ + +

5. Ihre Auswahlmöglichkeiten

+ + + +

6. Sicherheit

+ +

Wir ergreifen angemessene Maßnahmen, um Ihre Informationen vor unbefugtem Zugriff, Verwendung oder Offenlegung zu schützen. Es gibt jedoch keine zu 100 % sichere Methode der Übertragung über das Internet oder der elektronischen Speicherung.

+ +

7. Datenschutz für Kinder

+ +

Unsere App ist nicht für die Nutzung durch Kinder unter 13 Jahren bestimmt, und wir erfassen wissentlich keine persönlichen Informationen von Kindern unter 13 Jahren. Wenn wir feststellen, dass wir persönliche Informationen von einem Kind unter 13 Jahren erfasst haben, werden wir Schritte unternehmen, um diese Informationen zu löschen.

+ +

8. Änderungen dieser Datenschutzerklärung

+ +

Wir können diese Datenschutzerklärung von Zeit zu Zeit aktualisieren. Wir werden Sie über Änderungen informieren, indem wir die neue Datenschutzerklärung in der App veröffentlichen. Es wird empfohlen, diese Datenschutzerklärung regelmäßig auf Änderungen zu überprüfen.

+ +

9. Kontaktieren Sie uns

+

Wenn Sie Fragen zu dieser Datenschutzerklärung haben, kontaktieren Sie uns bitte unter:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-Mail: support@abbidot.com

+ +
+ + + + + diff --git a/app/src/main/assets/privacy_fr.html b/app/src/main/assets/privacy_fr.html new file mode 100644 index 0000000..5f44f4a --- /dev/null +++ b/app/src/main/assets/privacy_fr.html @@ -0,0 +1,71 @@ + + +
+

Chez ABBI PET INC, nous respectons et nous engageons à protéger votre vie privée. Cette politique de confidentialité décrit comment nous collectons, utilisons, protégeons et conservons vos informations de manière confidentielle lorsque vous utilisez notre application mobile (« App »).

+ +

1. Informations que nous collectons

+ + + +

2. Comment nous utilisons vos informations

+ + + +

3. Confidentialité et sécurité des données

+ +

4. Partage de vos informations

+ + +

5. Vos choix

+ + + +

6. Sécurité

+ +

Nous prenons des mesures raisonnables pour protéger vos informations contre tout accès, utilisation ou divulgation non autorisé. Cependant, aucune méthode de transmission sur Internet ou méthode de stockage électronique n'est sécurisée à 100 %.

+ +

7. Confidentialité des enfants

+ +

Notre App n'est pas destinée à être utilisée par des enfants de moins de 13 ans, et nous ne collectons pas sciemment d'informations personnelles auprès d'enfants de moins de 13 ans. Si nous découvrons que nous avons collecté des informations personnelles auprès d'un enfant de moins de 13 ans, nous prendrons des mesures pour supprimer ces informations.

+ +

8. Modifications de cette politique de confidentialité

+ +

Nous pouvons mettre à jour cette politique de confidentialité de temps à autre. Nous vous informerons de toute modification en publiant la nouvelle politique de confidentialité dans l'App. Il vous est conseillé de consulter régulièrement cette politique de confidentialité pour toute modification.

+ +

9. Contactez-nous

+

Si vous avez des questions concernant cette politique de confidentialité, veuillez nous contacter à :

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-mail : support@abbidot.com

+ +
+ + + + + diff --git a/app/src/main/assets/privacy_zh.html b/app/src/main/assets/privacy_zh.html new file mode 100644 index 0000000..38ae2d1 --- /dev/null +++ b/app/src/main/assets/privacy_zh.html @@ -0,0 +1,71 @@ + + +
+

在 ABBI PET INC,我们尊重并致力于保护您的隐私。本隐私政策说明了当您使用我们的移动应用程序("App")时,我们如何收集、使用、保护您的信息并对您的信息予以保密。

+ +

1. 我们收集的信息

+ + + +

2. 我们如何使用您的信息

+ + + +

3. 数据保密与安全

+ +

4. 信息的共享

+ + +

5. 您的选择

+ + + +

6. 安全

+ +

我们采取合理措施保护您的信息免受未经授权的访问、使用或披露。然而,任何通过互联网传输的方法或电子存储方法都不是 100% 安全的。

+ +

7. 儿童隐私

+ +

我们的 App 不面向 13 岁以下的儿童使用,我们也不会有意收集 13 岁以下儿童的个人信息。如果我们发现我们收集了 13 岁以下儿童的个人信息,我们将采取措施删除该信息。

+ +

8. 本隐私政策的变更

+ +

我们可能会不时更新本隐私政策。我们将通过在 App 内发布新的隐私政策来通知您任何变更。建议您定期查阅本隐私政策以了解任何变更。

+ +

9. 联系我们

+

如果您对本隐私政策有任何疑问,请通过以下方式联系我们:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

电子邮箱:support@abbidot.com

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

Allgemeine Geschäftsbedingungen für das ABBIDOT Tracker-Abonnement

+
+

1. Abonnementpläne

+

ABBIDOT bietet drei Abonnementpläne:

+ +

Alle Abonnements werden am Ende jedes Abrechnungszyklus automatisch verlängert, sofern sie nicht vom Nutzer gekündigt werden.

+

Nutzer können ihr Abonnement jederzeit kündigen. Nach der Kündigung bleibt das Abonnement bis zum Ende der aktuellen Abrechnungsperiode aktiv, und es werden keine weiteren Gebühren erhoben.

+

Das Gerät funktioniert während der aktiven Abonnementperiode weiterhin normal.

+
+

2. Rückerstattungsrichtlinie

+

2.1 Automatische Rückerstattung (innerhalb von 48 Stunden)

+

Alle Abonnementkäufe sind innerhalb von 48 Stunden nach Zahlung für eine volle automatische Rückerstattung berechtigt. Rückerstattungen werden automatisch ohne manuelle Prüfung verarbeitet.

+
+

2.2 Standard-Rückerstattungszeitraum (30 Tage)

+

Nach der anfänglichen 48-Stunden-Periode können Nutzer innerhalb von 30 Tagen nach dem Kauf eine Rückerstattung beantragen.

+ +
+

2.3 Keine Rückerstattung nach 30 Tagen

+

Abonnements, die älter als 30 Tage sind, sind nicht erstattungsfähig.

+
+

3. Abonnementkündigung

+

Nutzer können ihr Abonnement jederzeit kündigen.

+ +
+

4. Richtlinienaktualisierungen

+

ABBIDOT behält sich das Recht vor, diese Allgemeinen Geschäftsbedingungen jederzeit zu aktualisieren oder zu ändern. Nutzer werden über wesentliche Änderungen informiert.

+

Durch das Abonnieren von ABBIDOT-Diensten stimmen Sie diesen Bedingungen zu.

+
+

5. Kundenservice

+

Wenn Sie auf Schwierigkeiten stoßen, kontaktieren Sie uns bitte unter:

+

subscription@abbidot.com

+

Unser Support-Team wird Ihnen so schnell wie möglich helfen.

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

Conditions générales de l'abonnement ABBIDOT Tracker

+
+

1. Plans d'abonnement

+

ABBIDOT propose trois plans d'abonnement :

+ +

Tous les abonnements sont automatiquement renouvelés à la fin de chaque cycle de facturation, sauf annulation par l'utilisateur.

+

Les utilisateurs peuvent annuler leur abonnement à tout moment. Après l'annulation, l'abonnement restera actif jusqu'à la fin de la période de facturation en cours, et aucun frais supplémentaire ne sera appliqué.

+

L'appareil continuera de fonctionner normalement pendant la période d'abonnement active.

+
+

2. Politique de remboursement

+

2.1 Remboursement automatique (dans les 48 heures)

+

Tous les achats d'abonnement sont éligibles à un remboursement automatique intégral dans les 48 heures suivant le paiement. Les remboursements seront traités automatiquement sans examen manuel.

+
+

2.2 Fenêtre de remboursement standard (30 jours)

+

Après la période initiale de 48 heures, les utilisateurs peuvent demander un remboursement dans les 30 jours suivant l'achat.

+ +
+

2.3 Aucun remboursement après 30 jours

+

Les abonnements de plus de 30 jours ne sont pas remboursables.

+
+

3. Annulation de l'abonnement

+

Les utilisateurs peuvent annuler leur abonnement à tout moment.

+ +
+

4. Mises à jour de la politique

+

ABBIDOT se réserve le droit de mettre à jour ou de modifier ces Conditions générales à tout moment. Les utilisateurs seront informés des modifications importantes.

+

En vous abonnant aux services ABBIDOT, vous acceptez ces conditions.

+
+

5. Service client

+

Si vous rencontrez des difficultés, veuillez nous contacter à :

+

subscription@abbidot.com

+

Notre équipe d'assistance vous aidera dans les meilleurs délais.

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

ABBIDOT 追踪器订阅条款与条件

+
+

1. 订阅计划

+

ABBIDOT 提供三种订阅计划:

+ +

所有订阅在每个计费周期结束时自动续费,除非用户取消。

+

用户可随时取消订阅。取消后,订阅将在当前计费周期结束前保持有效,且不会产生额外费用。

+

在有效订阅期内,设备将继续正常运行。

+
+

2. 退款政策

+

2.1 自动退款(48 小时内)

+

所有订阅购买均可在付款后 48 小时内获得全额自动退款。退款将自动处理,无需人工审核。

+
+

2.2 标准退款窗口(30 天)

+

在初始 48 小时之后,用户可在 购买后 30 天内申请退款。

+ +
+

2.3 30 天后不予退款

+

超过 30 天的订阅不可退款。

+
+

3. 订阅取消

+

用户可随时取消订阅。

+ +
+

4. 政策更新

+

ABBIDOT 保留随时更新或修改这些条款与条件的权利。重大变更将通知用户。

+

订阅 ABBIDOT 服务即表示您同意这些条款。

+
+

5. 客户支持

+

如果您遇到任何困难,请通过以下方式联系我们:

+

subscription@abbidot.com

+

我们的支持团队将尽快为您提供帮助。

+
+ + + + + diff --git a/app/src/main/assets/terms_cn.html b/app/src/main/assets/terms_cn.html deleted file mode 100644 index ce380d0..0000000 --- a/app/src/main/assets/terms_cn.html +++ /dev/null @@ -1,476 +0,0 @@ -

˳ABBIDOTɼʹ

лʹܶƼ޹˾ļܶƼ򡰱˾ǡIJƷͷʹܶƼķͲƷǰϸĶʹļơһʹܶƼIJƷעΪܶƼûȷΪ׼ʾͬⱾȫݡй۰̨סκιңرõرڱв˵ǻʵʱԸʾΪܶƼ֮ͷͲƷʹö޽ľзԼЭ顣ǿܻ᲻ʱЩݷشҽԹķʽ֪ı飬ֹͣʹܶƼķͲƷ֪ͨʹñ˾ṩķͲƷӦóƽ̨ͲƷ÷ɽֹΪѽ˸º

һ

δ18꣬ȡøĸ໤˵ͬ󣬲ʸʹܶƼķͲƷͬңܶضƽ̨Ӧƣϸڹңع涨18꣬עΪܶƼûϸ¹

(1ṩʵЧ׼ȷµĸϽעᡣ(2ίעܶƼƷ˻ΪעܶƼ˻

(3Ʊ˻¼ϢȨͣתʹ˻

(4κδʹܶƼƷ˻ͣܶƼṩķͲƷΪ֪ͨǡ

(5ͨܶƼƷ˻κκǷ񾭹ͬ⡣÷޶ڣܶƼκʧδȨʹ˻Ϊ

Ȩ

(1Զ⣬ܶƼƷڵݣı롢űơͼΡӰ֡¼¼¡űͼ廭Ӧó򡢽ܼݣΪܶƼȨʹõĵУȨ̱ꡢרɱڱȷ˵⣬ܶƼȨ

(2̱ꡢ־ۡװ磬ܶƼƺͱ־ƣΪܶƼСעͣɡͨʹܶƼķܶƼIJƷκ̱ꡢ־ۡװɻκȨ

(3ͬⲻɾκδܶƼƷػӡIJϵȨ

(4κȨȨƷݷΧڣܶƼ˵ġ޵ġתõġתɵġɳĽΪԤʹĿҽܶƼڹ޶ڷʡزʹôݵȨݣаκ̱֪ʶȨκȨȨдݽ޸ʹãֹҵ;

(5ܶƼලʹòκʱκɱɻݵķȨ޵ȨܶƼΥõܶƼ֪ʶȨɾκݵȨܶƼ޵ʹȨܶƼݰȨȨκȨķ

(6ͬܶƼܶƼصضʹȨ⣬δܶƼͬ⣬ʹáơ༭ء롢ۡƷκηʽκݣϷκݡδȨʹݿʹܵ»ָغʹܶƼԴ˲еκΡ

ܶƼӦóƽ̨ļƽ̨ϷϷ֡ƬƵۺݣ˻κδУͬܶƼɣ

(1ʾȨκݣܶƼκûƽ̨ݸ

(2ͬܶƼʱɾ޸κηƽ̨ƽ̨صΥݣַФȨȨȨڰҵ;ڵκΥΪݣΥơ޸ġ롢ƷתɡַתõȨ

(3ѱɾݿѱתشܼܶƼƽ̨ظҪ÷ɾθϡ

(4ⷢܶƼƽ̨ϵݾڷDZܵĻṩܶƼõġǶҵġתõġתɵġ˰ġȫ緶ΧɡԲ֪ͨȷϵΪκĿʹƽ̨ϵݣڿƷԼ޸ĻĽʹƷ

ġûΪ淶

ܶƼΪרҵƽ̨߱罻ܣ˽Ⲣϸ¹

(1ܶƼȨɸѡලɾûIJݣûٱߡ֤ΥݵȨ

(2𷢲κΥġġ󵼵ġɧŵġɫġġӵġӵĻ˷еġǡĻΥ÷ɷݡӻκξΪ

(3𷢲κδӵȫɼȨݣгֻᵽκ

ɡ

(4𷢲κο˺ûΪûƬ绰ַ

Ϣ

(5𷢲κι桢ҵݣκεijͽҵܶƼȨ

(6ģ¡αװκ˻֯ܶƼԱ

(7ʹԶܶƼƽ̨ƷκԶץȡھƵݲɼ

(8𷢲κοܹܡȡ۸ƽ̨ȫϵͳ룬κοܸš𻵡ơʹ޷Сɻƽ̨ܵݡ

塢ʾ

ܶƼվý塢ƽ̨ƶӦԼƷӻܹͨܶƼƽ̨лⲢʾܶƼϿɡලЧƵΪܶƼԵݡ߻ͬгеķա

(1ڹʹܶƼIJƷǰǿ漰зա(2ΪκݻյκϢӿ漰зա

(3ڻ͵ӲƷԣܶƼ֤ƽ̨Ʒϵġ޲ġκδ󶼽õĻûκкġ

(4ڻ͵ӲƷԣܶƼķͲƷκʽijŵڷ񼰲Ʒ׼ȷԡԡʵԡɿԻijŵ

(5÷޶ڣܶƼ漰ͲƷԼͨƽ̨ȡûӴκƷб֤𣬰Ȩʵԡض;ԼȨԵı֤

(6÷޶ڣܶƼʹûʹ÷ͲƷĹܿܵκʧ˺еκΡ

(7÷޶ڣܶƼûĻκΪ໥ܵκʧ˺еκΡ

(8÷޶ڣܶƼûƽ̨ϵκݾеκ

Ρ

(9ܶƼûκû֮飬ȨоǷ롣

(10÷û涨ķΧڣʹܶƼķƷκʧи

(11ܶƼϣܳǵķͲƷǣDzκν֤

ߡֹ

(1ܶƼκʱ䲻ֹ֪ͨ޸κܶƼӦóۼƻƷ

(2÷ɣܶƼԲеκεκʱκԭ򶳽ᡢֹֹ˻ɾĵκηݣʹȫ򲿷ַ͹ܡ

(3Ⲣͬ⣬ܶƼƽ̨ϷijЩݣڻҪлƽ̨ʾûݣʹʻֹԽʾȨ÷ɣɾصݡ

(4˻ֹֹͣʹܶƼķͲƷȻЧ

ˡ⳥

(1ܶƼϣǵķͲƷܶƼҲ뱣ɵκ𺦡

(2ͬ⳥Ϊ֮ṩ绤ʹܶƼ߼Ա¡ԱȨ̼Ӧʹõݻƽ̨ͲƷʹáƽ̨ػƽ̨ûصΪκΥʹκηɻκεȨĻκηʽ֮صΡ⡢ʧü֧ʦѡΪļ̳ˡߡаˡƲ˺壬شȫ÷׷κʹƽ̨йصʧеܶƼκȨ

(3ܶƼκʹû޷ʹܶƼƽ̨ͨƽ̨Ʒƽ̨ûΪϵϵģμܶƼμܶƼƽ̨ʹصκݡμκֱӵġӵġżȻġĽ𺦳еΣκʧʧʹܶƼѾ֪ɴ𺦡

(4еʹܶƼͲƷȫΡʹܶƼͲƷݶ𺦵ΨһʩֹͣʹñͲƷʹøƽ̨ɵκ𺦻ʧܶƼ⳥β1Ԫҡ

š˾ϽȨ

й۰̨סκιңòͬ

(1ͬ⣬ܶƼλй½й½˾ϽܶƼйϽȨ

(2ͬ⣬ƽ̨˽ܶƼ֮κӦܵй½ķɹϽĶִкͽͼĽӦй½ķɡ

(3ܶƼͱݻִзκ飬˫ӦѺЭ̽Э̲ʱκһܶƼסصķԺϡ

ʮ涨

(1ͬܶƼڷķΧͨӷʽ͸κ֪ͨЭ顢¶ͨžзЧ

(2ͬܶƼԲ֪ͨκʱκתڱµȨ񣬳Ƿй涨⽫ӰڱµȨ

(3ͬеκβֱ϶ΪЧಿӦЧ

лĶκʣµܶƼѯ绰0755-86352225

 

\ No newline at end of file diff --git a/app/src/main/assets/terms_de.html b/app/src/main/assets/terms_de.html new file mode 100644 index 0000000..5660bca --- /dev/null +++ b/app/src/main/assets/terms_de.html @@ -0,0 +1,77 @@ + + + +
+

1. Annahme der Bedingungen

+ +

Durch das Herunterladen, Installieren und Verwenden der mobilen ABBIDOT-App („App“) erklären Sie sich mit diesen Allgemeinen Geschäftsbedingungen („Bedingungen“) einverstanden. Wenn Sie diesen Bedingungen nicht zustimmen, verwenden Sie die App nicht.

+ + + +

2. Nutzung der App

+ + + + + +

3. Konten und Sicherheit

+ +

4. Datenschutz

+ +

Ihre Nutzung der App unterliegt auch unserer Datenschutzerklärung, die durch Verweis in diese Bedingungen aufgenommen wird. Bitte lesen Sie unsere Datenschutzerklärung, um unsere Praktiken in Bezug auf Ihre Informationen zu verstehen.

+ +

5. Nutzergenerierte Inhalte

+ + + +

6. Geistiges Eigentum

+ +

Alle Inhalte, Funktionen und Funktionalitäten der App, einschließlich, aber nicht beschränkt auf Texte, Grafiken, Logos und Software, sind das ausschließliche Eigentum von ABBI PET INC oder seinen Lizenzgebern und durch Urheberrecht, Markenrecht und andere Gesetze zum geistigen Eigentum geschützt.

+ +

7. Kündigung

+ +

ABBI PET INC kann Ihren Zugriff auf die App jederzeit ohne Vorankündigung oder Haftung aus beliebigen Gründen kündigen oder aussetzen, auch wenn Sie diese Bedingungen verletzen. Bei Kündigung erlischt Ihr Recht zur Nutzung der App sofort.

+ +

8. Haftungsausschluss und Haftungsbeschränkung

+ + +

9. Anwendbares Recht

+

Diese Bedingungen unterliegen den Gesetzen des Bundesstaates Texas und sind in Übereinstimmung mit diesen auszulegen, ohne Berücksichtigung seiner Grundsätze des Kollisionsrechts.

+ +

10. Änderungen der Bedingungen

+

ABBI PET INC behält sich das Recht vor, diese Bedingungen jederzeit zu ändern. Wir werden Sie über Änderungen informieren, indem wir die neuen Bedingungen in der App veröffentlichen. Ihre fortgesetzte Nutzung der App nach Inkrafttreten der Änderungen stellt Ihre Zustimmung zu den neuen Bedingungen dar.

+ +

11. Datengeheimhaltung

+

Wir verpflichten uns, die Vertraulichkeit Ihrer Daten zu wahren. Wir setzen die folgenden Maßnahmen zum Datenschutz ein:

+ + +

12. Kontaktieren Sie uns

+

Wenn Sie Fragen zu diesen Bedingungen haben, kontaktieren Sie uns bitte unter:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-Mail: support@abbidot.com

+ + +
diff --git a/app/src/main/assets/terms_fr.html b/app/src/main/assets/terms_fr.html new file mode 100644 index 0000000..4acea45 --- /dev/null +++ b/app/src/main/assets/terms_fr.html @@ -0,0 +1,77 @@ + + + +
+

1. Acceptation des conditions

+ +

En téléchargeant, installant et utilisant l'application mobile ABBIDOT (« App »), vous acceptez d'être lié par ces Conditions générales (« Conditions »). Si vous n'acceptez pas ces Conditions, n'utilisez pas l'App.

+ + + +

2. Utilisation de l'App

+ + + + + +

3. Comptes et sécurité

+ +

4. Confidentialité

+ +

Votre utilisation de l'App est également régie par notre politique de confidentialité, qui est incorporée par référence dans ces Conditions. Veuillez consulter notre politique de confidentialité pour comprendre nos pratiques concernant vos informations.

+ +

5. Contenu de l'utilisateur

+ + + +

6. Propriété intellectuelle

+ +

Tout le contenu, toutes les fonctionnalités et caractéristiques de l'App, y compris mais sans s'y limiter les textes, graphiques, logos et logiciels, sont la propriété exclusive de ABBI PET INC ou de ses concédants et sont protégés par les lois sur le droit d'auteur, les marques et autres lois sur la propriété intellectuelle.

+ +

7. Résiliation

+ +

ABBI PET INC peut résilier ou suspendre votre accès à l'App à tout moment, sans préavis ni responsabilité, pour quelque raison que ce soit, y compris si vous enfreignez ces Conditions. En cas de résiliation, votre droit d'utiliser l'App cessera immédiatement.

+ +

8. Avertissements et limitation de responsabilité

+ + +

9. Droit applicable

+

Ces Conditions seront régies et interprétées conformément aux lois de l'État du Texas, sans égard à ses principes de conflit de lois.

+ +

10. Modifications des Conditions

+

ABBI PET INC se réserve le droit de modifier ces Conditions à tout moment. Nous vous informerons de toute modification en publiant les nouvelles Conditions dans l'App. Votre utilisation continue de l'App après l'entrée en vigueur des modifications constitue votre acceptation des nouvelles Conditions.

+ +

11. Confidentialité des données

+

Nous nous engageons à maintenir la confidentialité de vos données. Nous mettons en œuvre les mesures suivantes pour assurer la protection des données :

+ + +

12. Contactez-nous

+

Si vous avez des questions concernant ces Conditions, veuillez nous contacter à :

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

E-mail : support@abbidot.com

+ + +
diff --git a/app/src/main/assets/terms_zh.html b/app/src/main/assets/terms_zh.html new file mode 100644 index 0000000..85d3c2f --- /dev/null +++ b/app/src/main/assets/terms_zh.html @@ -0,0 +1,77 @@ + + + +
+

1. 条款的接受

+ +

下载、安装和使用 ABBIDOT 移动应用程序("App")即表示您同意受这些条款与条件("条款")的约束。如果您不同意这些条款,请勿使用本 App。

+ + + +

2. App 的使用

+ + + + + +

3. 账户与安全

+ +

4. 隐私

+ +

您对 App 的使用同时受我们的隐私政策约束,该政策通过引用并入本条款。请查阅我们的隐私政策,以了解我们关于您信息的处理方式。

+ +

5. 用户内容

+ + + +

6. 知识产权

+ +

App 的所有内容、功能和特性,包括但不限于文本、图形、标识和软件,均为 ABBI PET INC 或其许可方的独家财产,受版权、商标和其他知识产权法保护。

+ +

7. 终止

+ +

ABBI PET INC 可随时终止或暂停您对 App 的访问,无需事先通知或承担责任,原因包括您违反本条款。终止后,您使用 App 的权利将立即停止。

+ +

8. 免责声明与责任限制

+ + +

9. 适用法律

+

本条款受美国德克萨斯州法律管辖并据其解释,不适用其法律冲突原则。

+ +

10. 条款的变更

+

ABBI PET INC 保留随时修改本条款的权利。我们将通过在 App 内发布新条款的方式通知您任何变更。变更生效后,您继续使用 App 即表示您接受新条款。

+ +

11. 数据保密

+

我们致力于维护您数据的保密性。我们采取以下措施以确保数据安全:

+ + +

12. 联系我们

+

如果您对本条款有任何疑问,请通过以下方式联系我们:

+

ABBI PET INC

+

10700 Richmond Ave Suite 143

+

Houston, TX 77042

+

电子邮箱:support@abbidot.com

+ + +
diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNAccountFragment.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNAccountFragment.kt index f2b2375..e9a8761 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNAccountFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNAccountFragment.kt @@ -140,13 +140,17 @@ class LoginCNAccountFragment : activity.switchFragment(LoginRegisterCNActivity.Fragment_Code_Login) } - mViewBinding.llLoginCnAccountAgree.loginCnPolicy -> { - ViewUtil.instance.goPrivacyPolicy(mActivity!!) - } + mViewBinding.llLoginCnAccountAgree.loginCnPolicy -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) - mViewBinding.llLoginCnAccountAgree.loginCnTerms -> { - ViewUtil.instance.goServiceContract(mActivity!!) - } + mViewBinding.llLoginCnAccountAgree.loginCnTerms -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNCodeFragment.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNCodeFragment.kt index d2cc499..8cacd0e 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNCodeFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNCodeFragment.kt @@ -10,10 +10,10 @@ import com.abbidot.tracker.base.BaseFragment import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.FragmentLoginCnCodeBinding import com.abbidot.tracker.deprecated.ui.activity.LoginRegisterCNActivity -import com.abbidot.tracker.vm.cn.LoginCNViewModel -import com.abbidot.tracker.vm.cn.RegisterCNViewModel import com.abbidot.tracker.util.ViewUtil import com.abbidot.tracker.vm.CountDownTimerViewModel +import com.abbidot.tracker.vm.cn.LoginCNViewModel +import com.abbidot.tracker.vm.cn.RegisterCNViewModel /** @@ -131,13 +131,17 @@ class LoginCNCodeFragment : mViewBinding.btnStartLoginCnCode -> codeLogin() mViewBinding.llLoginCnCodeSendCode.btnGetCode -> getPhoneCode() - mViewBinding.llLoginCnCodeAgree.loginCnPolicy -> { - ViewUtil.instance.goPrivacyPolicy(mActivity!!) - } + mViewBinding.llLoginCnCodeAgree.loginCnPolicy -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) - mViewBinding.llLoginCnCodeAgree.loginCnTerms -> { - ViewUtil.instance.goServiceContract(mActivity!!) - } + mViewBinding.llLoginCnCodeAgree.loginCnTerms -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNFirstFragment.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNFirstFragment.kt index 22fe447..4df59cb 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNFirstFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/login/LoginCNFirstFragment.kt @@ -6,14 +6,15 @@ import androidx.fragment.app.viewModels import com.abbidot.baselibrary.constant.EventName import com.abbidot.baselibrary.eventbus.XEventBus import com.abbidot.baselibrary.util.LogUtil +import com.abbidot.tracker.R import com.abbidot.tracker.base.BaseFragment import com.abbidot.tracker.bean.UserBean import com.abbidot.tracker.constant.GetResultCallback import com.abbidot.tracker.databinding.FragmentLoginCnFirstBinding import com.abbidot.tracker.deprecated.ui.activity.LoginRegisterCNActivity -import com.abbidot.tracker.vm.cn.LoginCNViewModel import com.abbidot.tracker.util.ThirdPartyUtil import com.abbidot.tracker.util.ViewUtil +import com.abbidot.tracker.vm.cn.LoginCNViewModel /** * 登录第一步 @@ -80,12 +81,16 @@ class LoginCNFirstFragment : val activity = activity as LoginRegisterCNActivity activity.switchFragment(LoginRegisterCNActivity.Fragment_Code_Login) } - mViewBinding.llLoginCnPolicyTerms.loginCnPolicy -> { - ViewUtil.instance.goPrivacyPolicy(mActivity!!) - } - mViewBinding.llLoginCnPolicyTerms.loginCnTerms -> { - ViewUtil.instance.goServiceContract(mActivity!!) - } + mViewBinding.llLoginCnPolicyTerms.loginCnPolicy ->ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) + mViewBinding.llLoginCnPolicyTerms.loginCnTerms -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) } } diff --git a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/register/RegisterCNStartFragment.kt b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/register/RegisterCNStartFragment.kt index 23fd38e..538c17d 100644 --- a/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/register/RegisterCNStartFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/deprecated/ui/fragment/register/RegisterCNStartFragment.kt @@ -121,12 +121,16 @@ class RegisterCNStartFragment : mViewBinding.llRegisterCnGetPhoneCode.btnGetCode -> getPhoneCode() - mViewBinding.llRegisterCnCodeAgree.loginCnPolicy -> { - ViewUtil.instance.goPrivacyPolicy(mActivity!!) - } - mViewBinding.llRegisterCnCodeAgree.loginCnTerms -> { - ViewUtil.instance.goServiceContract(mActivity!!) - } + mViewBinding.llRegisterCnCodeAgree.loginCnPolicy -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) + mViewBinding.llRegisterCnCodeAgree.loginCnTerms -> ViewUtil.instance.goHtmlAssetContent( + mActivity!!, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) } } diff --git a/app/src/main/java/com/abbidot/tracker/dialog/PrivacyPolicyDialog.kt b/app/src/main/java/com/abbidot/tracker/dialog/PrivacyPolicyDialog.kt index f523921..c2bff23 100644 --- a/app/src/main/java/com/abbidot/tracker/dialog/PrivacyPolicyDialog.kt +++ b/app/src/main/java/com/abbidot/tracker/dialog/PrivacyPolicyDialog.kt @@ -44,9 +44,15 @@ class PrivacyPolicyDialog(activity: Activity) : override fun onClick(v: View) { when (v.id) { - R.id.tv_dialog_legal_info_privacy -> ViewUtil.instance.goPrivacyPolicy(mActivity) - R.id.tv_dialog_legal_info_terms_of_service -> ViewUtil.instance.goServiceContract( - mActivity + R.id.tv_dialog_legal_info_privacy -> ViewUtil.instance.goHtmlAssetContent( + mActivity, + mActivity.getString(R.string.txt_privacy_policy), + mActivity.getString(R.string.txt_privacy_html) + ) + R.id.tv_dialog_legal_info_terms_of_service -> ViewUtil.instance.goHtmlAssetContent( + mActivity, + mActivity.getString(R.string.txt_service_contract), + mActivity.getString(R.string.txt_terms_html) ) R.id.btn_dialog_legal_info_reject -> { 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 41897e0..22cf34b 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 @@ -50,7 +50,6 @@ import com.abbidot.tracker.ui.fragment.data.ActivityV2Fragment import com.abbidot.tracker.ui.fragment.data.RouteV3Fragment import com.abbidot.tracker.ui.fragment.map.MapV3Fragment import com.abbidot.tracker.ui.fragment.pet.PetV2Fragment -import com.abbidot.tracker.util.SocketUtilManage import com.abbidot.tracker.util.Util import com.abbidot.tracker.util.ViewUtil import com.abbidot.tracker.util.bluetooth.SRBleUtil @@ -118,7 +117,7 @@ class HomeV2Activity : BaseActivity(ActivityHomeV2Binding ) private var mBleListenerReceiver: BluetoothMonitorReceiver? = null - private var mSocketUtilManage: SocketUtilManage? = null +// private var mSocketUtilManage: SocketUtilManage? = null // private val mBleReportManage: BleReportManage by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { // mSocketUtilManage = SocketUtilManage() // mSocketUtilManage?.initEasySocket(mContext) @@ -840,7 +839,7 @@ class HomeV2Activity : BaseActivity(ActivityHomeV2Binding super.onDestroy() LogUtil.e("HomeV2Activity---------------onDestroy") stopCountDownConBle() - mSocketUtilManage?.destroy() +// mSocketUtilManage?.destroy() mBleListenerReceiver?.let { unregisterReceiver(it) } diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/account/CreateAccountActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/account/CreateAccountActivity.kt index fb44120..e874f27 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/account/CreateAccountActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/account/CreateAccountActivity.kt @@ -121,14 +121,22 @@ class CreateAccountActivity : val span1 = SpannableString(str1) span1.setSpan(object : ClickableSpan() { override fun onClick(v: View) { - ViewUtil.instance.goServiceContract(mActivity) + ViewUtil.instance.goHtmlAssetContent( + mActivity, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) } }, 40, 59, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) val span2 = SpannableString(str2) span2.setSpan(object : ClickableSpan() { override fun onClick(v: View) { - ViewUtil.instance.goPrivacyPolicy(mActivity) + ViewUtil.instance.goHtmlAssetContent( + mActivity, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) } }, 0, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/set/AboutActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/set/AboutActivity.kt index 27ef8de..554f441 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/set/AboutActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/set/AboutActivity.kt @@ -12,7 +12,7 @@ import com.qmuiteam.qmui.widget.grouplist.QMUICommonListItemView class AboutActivity : BaseActivity(ActivityAboutBinding::inflate) { - private val mWebsiteUrl = "https://www.abbidot.com" + private val mWebsiteUrl = "www.abbidot.com" override fun getTopBar() = mViewBinding.ilAboutTopBar.titleTopBar @@ -28,20 +28,25 @@ class AboutActivity : BaseActivity(ActivityAboutBinding::i tvAboutVersion.text = versionStr //服务协议 - setButtonData(aboutServiceContract.trackerManageSettingItem, - getString(R.string.txt_service_contract)) + setButtonData( + aboutServiceContract.trackerManageSettingItem, + getString(R.string.txt_service_contract) + ) //隐私政策 - setButtonData(aboutPrivacyPolicy.trackerManageSettingItem, - getString(R.string.txt_privacy_policy)) + setButtonData( + aboutPrivacyPolicy.trackerManageSettingItem, getString(R.string.txt_privacy_policy) + ) //官网 - setButtonData(aboutOfficialWebsite.trackerManageSettingItem, - getString(R.string.txt_website), mWebsiteUrl) + setButtonData( + aboutOfficialWebsite.trackerManageSettingItem, + getString(R.string.txt_website), mWebsiteUrl + ) } } - private fun setButtonData(commonItemView: QMUICommonListItemView, - title: String, - content: String = "") { + private fun setButtonData( + commonItemView: QMUICommonListItemView, title: String, content: String = "" + ) { commonItemView.apply { text = title if (!TextUtils.isEmpty(content)) detailText = content @@ -53,13 +58,21 @@ class AboutActivity : BaseActivity(ActivityAboutBinding::i override fun onClick(v: View?) { when (v!!.id) { //服务协议 - R.id.about_service_contract -> ViewUtil.instance.goServiceContract(mActivity) + R.id.about_service_contract -> ViewUtil.instance.goHtmlAssetContent( + mActivity, + getString(R.string.txt_service_contract), + getString(R.string.txt_terms_html) + ) //隐私政策 - R.id.about_privacy_policy -> ViewUtil.instance.goPrivacyPolicy(mActivity) + R.id.about_privacy_policy -> ViewUtil.instance.goHtmlAssetContent( + mActivity, + getString(R.string.txt_privacy_policy), + getString(R.string.txt_privacy_html) + ) //官网 R.id.about_official_website -> WebViewActivity.startWebViewActivity( - mActivity, - getString(R.string.txt_website), mWebsiteUrl) + mActivity, getString(R.string.txt_website), "https://$mWebsiteUrl" + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SureSubscriptionPlanActivity.kt b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SureSubscriptionPlanActivity.kt index d811962..a2fc24d 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SureSubscriptionPlanActivity.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/activity/subscribe/SureSubscriptionPlanActivity.kt @@ -515,16 +515,12 @@ class SureSubscriptionPlanActivity : createOrder() } - ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions -> { - val url = if (AppUtils.isChina()) { - "file:///android_asset/subscription_terms_conditions_cn.html" - } else { - "file:///android_asset/subscription_terms_conditions_en.html" - } - WebViewActivity.startWebViewActivity( - mActivity, getString(R.string.txt_service_contract), url + ilSubscribePlanDetail.tvSureSubscribePlanTermsConditions -> + ViewUtil.instance.goHtmlAssetContent( + mActivity, + getString(R.string.txt_service_contract), + getString(R.string.txt_subscription_terms_conditions_html) ) - } ilSubscribePlanInsurance.ivSureSubscribePlanInsurance -> { val url = if (AppUtils.isChina()) { diff --git a/app/src/main/java/com/abbidot/tracker/ui/common/map/HomeMapCommonV3.kt b/app/src/main/java/com/abbidot/tracker/ui/common/map/HomeMapCommonV3.kt index 1e57a3f..4d738cc 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/common/map/HomeMapCommonV3.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/common/map/HomeMapCommonV3.kt @@ -196,10 +196,6 @@ class HomeMapCommonV3 @Inject constructor() : BaseMapCommon() { } } - fun getUserGoogleLatLng(): LatLng? { - return mHomeMapGoogleMapFragment?.mUserLatLng - } - fun addUserAndPetLine() { mHomeMapGoogleMapFragment?.addUserAndPetLine() } diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/account/CreateAccountV2OneFragment.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/account/CreateAccountV2OneFragment.kt index 677c763..8d42946 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/fragment/account/CreateAccountV2OneFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/account/CreateAccountV2OneFragment.kt @@ -79,14 +79,22 @@ class CreateAccountV2OneFragment : BaseFragment(FragmentMapV3Binding::i } } + //处理宠物经纬度都是0情况 mCountDownTimerViewModel.mCountDownEndLiveData.observe(this) { mCountDownTimerViewModel.isStartCountDown = true mViewBinding.llHomeMapTopPet.homeDataPetNameSmall.text = @@ -344,6 +342,12 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i okTextResId = R.string.txt_sure ) } + //接收发送指令后设备返回的数据 + XEventBus.observe(this, EventName.DeviceReceiveData) { receiveData: ReceiveDeviceData -> + getHomeV2Activity()?.getPet(false)?.apply { + if (macID == receiveData.mac) parseData(receiveData.data) + } + } //蓝牙上报的数据 XEventBus.observe(this, EventName.BleReportData) { reportData: BleReportDataBean -> getHomeV2Activity()?.getPet(false)?.apply { @@ -354,22 +358,6 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i XEventBus.observe(this, EventName.BleFirmwareVersion) { receiveData: ReceiveDeviceData -> showDfuTipDialog(receiveData) } - //设备获取手机位置 - XEventBus.observe(this, EventName.BleGetLocation) { mac: String -> - getHomeV2Activity()?.getPet(false)?.apply { - if (macID == mac) { - mHomeMapCommon.getUserGoogleLatLng()?.let { latLng: LatLng -> - SRBleUtil.instance.getConnectMacDevice(mac)?.let { ble -> - SRBleUtil.instance.writeData( - ble.bleDevice, SRBleCmdUtil.instance.getPhoneLocation( - latLng.latitude, latLng.longitude - ) - ) - } - } - } - } - } //接收蓝牙连接状态 XEventBus.observe(this, EventName.ConnectDeviceState) { trackBle: BleTrackDeviceBean -> getHomeV2Activity()?.getPet(false)?.apply { @@ -423,6 +411,20 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i // } } + private fun parseData(data: ByteArray?) { + if (null != data && data.isNotEmpty()) { + val data0 = SRBleCmdUtil.instance.byteToInt(data[0]) + val data1 = SRBleCmdUtil.instance.byteToInt(data[1]) +// val data2 = SRBleCmdUtil.instance.byteToInt(data[2]) + if (data0 == 0x2C && data1 == 1) { + getHomeV2Activity()?.getPet(false)?.let { + mMapViewModel.getMapDeviceStatus(it.deviceId, false) + } + stopRefreshLocation() + } + } + } + /** *显示固件升级弹窗提示 */ @@ -706,7 +708,7 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i // return // } getHomeV2Activity()?.apply { - if (mPetList.size == 0) { + if (mPetList.isEmpty()) { return } needGpsToGCJ02 = true @@ -720,7 +722,7 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i mViewBinding.ilHomeMapPetLocation.root.visibility = View.INVISIBLE mViewBinding.ivHomeMapBleConState.setImageResource(R.drawable.icon_map_offline) isCanLive = false - isShowAllPet=false + isShowAllPet = false setRefreshLocationBtnState() ViewUtil.instance.selectPetDialogShow( @@ -811,59 +813,59 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i /** * 显示没有设置wifi弹窗 */ - private fun showNoSetWifiDialog(mapDeviceBean: MapDeviceBean) { - mapDeviceBean.apply { - getHomeV2Activity()?.let { - it.getPet(false)?.let { pet -> - //检测没有设置wif就提示弹窗 - if (pet.shared == ConstantInt.NoShare && pet.availableOrder == ConstantInt.Type1 && inWifiZone == ConstantInt.Type2 && !pet.showNoWifiDialog) { - pet.showNoWifiDialog = true - CommonDialog2( - mContext!!, - getString(R.string.txt_add_wifi_tips), - getString(R.string.txt_add), - object : BaseDialog.OnDialogOkListener { - override fun onOkClick(dialog: BaseDialog<*>) { - Intent( - mContext, AddWifiPowerZone1Activity::class.java - ).let { i -> - //判断是否国内经纬度,需要坐标转换 - if (MMKVUtil.getBoolean(MMKVKey.isGpsToGCJ02)) { - val convertLatLon = - LonAndLatUtil.convertFromWGS84ToGCJ02( - latitude, longitude - ) - i.putExtra( - ConstantString.Latitude, convertLatLon[0] - ) - i.putExtra( - ConstantString.Longitude, convertLatLon[1] - ) - } else { - i.putExtra(ConstantString.Latitude, latitude) - i.putExtra(ConstantString.Longitude, longitude) - } - i.putExtra(ConstantString.Pet, pet) - startActivity(i) - } - } - }).show() - } - } - } - } - } +// private fun showNoSetWifiDialog(mapDeviceBean: MapDeviceBean) { +// mapDeviceBean.apply { +// getHomeV2Activity()?.let { +// it.getPet(false)?.let { pet -> +// //检测没有设置wif就提示弹窗 +// if (pet.shared == ConstantInt.NoShare && pet.availableOrder == ConstantInt.Type1 && inWifiZone == ConstantInt.Type2 && !pet.showNoWifiDialog) { +// pet.showNoWifiDialog = true +// CommonDialog2( +// mContext!!, +// getString(R.string.txt_add_wifi_tips), +// getString(R.string.txt_add), +// object : BaseDialog.OnDialogOkListener { +// override fun onOkClick(dialog: BaseDialog<*>) { +// Intent( +// mContext, AddWifiPowerZone1Activity::class.java +// ).let { i -> +// //判断是否国内经纬度,需要坐标转换 +// if (MMKVUtil.getBoolean(MMKVKey.isGpsToGCJ02)) { +// val convertLatLon = +// LonAndLatUtil.convertFromWGS84ToGCJ02( +// latitude, longitude +// ) +// i.putExtra( +// ConstantString.Latitude, convertLatLon[0] +// ) +// i.putExtra( +// ConstantString.Longitude, convertLatLon[1] +// ) +// } else { +// i.putExtra(ConstantString.Latitude, latitude) +// i.putExtra(ConstantString.Longitude, longitude) +// } +// i.putExtra(ConstantString.Pet, pet) +// startActivity(i) +// } +// } +// }).show() +// } +// } +// } +// } +// } private fun setRefreshLocationBtnState() { getHomeV2Activity()?.apply { getPet(false)?.let { pet -> mViewBinding.ivHomeMapRefreshLocation.let { - val tintColor = if (SRBleUtil.instance.isMacConnect(pet.macID)) { - it.setBackgroundResource(R.drawable.shape_yellow_circle_bg) - R.color.select_color3 - } else if (!isCanLive) { + val tintColor = if (!isCanLive) { it.setBackgroundResource(R.drawable.shape_white_circle_bg) R.color.grey_color_91 + } else if (SRBleUtil.instance.isMacConnect(pet.macID)) { + it.setBackgroundResource(R.drawable.shape_yellow_circle_bg) + R.color.select_color3 } else { it.setBackgroundResource(R.drawable.shape_yellow_circle_bg) R.color.select_color3 @@ -1025,38 +1027,62 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i } } + + /** + * 一键定位等待动画 + */ + private fun refreshLocationAnim() { + getHomeV2Activity()?.apply { + isNotifyRefreshLocation = true + isMoveCamera = true + mViewBinding.llHomeMapTopPet.homeDataPetNameSmall.let { + it.setText(R.string.txt_locating) + it.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0) + } + notifyRefreshLocationTimestamp = System.currentTimeMillis() + mHomeMapCommon.greenRippleCircleAnim() + mViewBinding.ivHomeMapRefreshLocation.let { + it.isEnabled = false + it.imageTintList = ColorStateList.valueOf( + ContextCompat.getColor( + mContext, R.color.grey_color + ) + ) + mAnimatorSet = ViewUtil.instance.viewRotationAnimator(it, true) + } + mMapViewModel.stopGetData() + } + } + /** * 开始通知一键定位 */ private fun notifyRefreshLocation() { getHomeV2Activity()?.apply { getPet()?.let { pet -> - if (SRBleUtil.instance.isMacConnect(pet.macID)) { - showToast(R.string.txt_pet_close, gravity = Gravity.CENTER) - } else if (null != mMapDeviceBean && mMapDeviceBean!!.powerSwitch == ConstantInt.Type2) { + if (null != mMapDeviceBean && mMapDeviceBean!!.powerSwitch == ConstantInt.Type2) { val string = String.format(getString(R.string.txt_move_wake_up), pet.petName) showToast(string, gravity = Gravity.CENTER) } else if (!isCanLive) { showToast(R.string.txt_locate_works, gravity = Gravity.CENTER) - } else if (!isNotifyRefreshLocation) { - isNotifyRefreshLocation = true - isMoveCamera = true - mViewBinding.llHomeMapTopPet.homeDataPetNameSmall.let { - it.setText(R.string.txt_locating) - it.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0) + } else if (SRBleUtil.instance.isMacConnect(pet.macID)) { + //g40 + if (pet.deviceType == ConstantInt.Type2) { + showToast(R.string.txt_pet_close, gravity = Gravity.CENTER) + return } - notifyRefreshLocationTimestamp = System.currentTimeMillis() - mHomeMapCommon.greenRippleCircleAnim() - mViewBinding.ivHomeMapRefreshLocation.let { - it.isEnabled = false - it.imageTintList = ColorStateList.valueOf( - ContextCompat.getColor( - mContext, R.color.grey_color - ) + val userGpsLat = MMKVUtil.getDouble(MMKVKey.UserGpsLat) + val userGpsLon = MMKVUtil.getDouble(MMKVKey.UserGpsLon) + if (userGpsLat == 0.0 && userGpsLon == 0.0) { + showToast(R.string.txt_pet_close, gravity = Gravity.CENTER) + } else { + SRBleUtil.instance.isConnectBleSendCmdData( + pet.macID, SRBleCmdUtil.instance.refreshLocation(userGpsLat, userGpsLon) ) - mAnimatorSet = ViewUtil.instance.viewRotationAnimator(it, true) + refreshLocationAnim() } - mMapViewModel.stopGetData() + } else if (!isNotifyRefreshLocation) { + refreshLocationAnim() mMapViewModel.setupRefreshLocation(pet.deviceId) } } @@ -1127,7 +1153,7 @@ class MapV3Fragment : BaseFragment(FragmentMapV3Binding::i when (v!!) { homeMapRefreshBtn -> { getHomeV2Activity()?.let { - if (it.isRequestPetData && it.mPetList.size == 0) { + if (it.isRequestPetData && it.mPetList.isEmpty()) { showToast(R.string.no_bind_pet) return } diff --git a/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/BaseGoogleMapFragment.kt b/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/BaseGoogleMapFragment.kt index 4cbe9c3..d4da4c6 100644 --- a/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/BaseGoogleMapFragment.kt +++ b/app/src/main/java/com/abbidot/tracker/ui/fragment/map/googlemap/BaseGoogleMapFragment.kt @@ -1030,7 +1030,7 @@ abstract class BaseGoogleMapFragment : LogUtil.e("getLastLocation:exception" + taskLocation.exception) } if (null != location) { - mUserLatLng = LatLng(location.latitude, location.longitude) + setUserLatLng(location) if (isLocationSuccessCallback) { setUserMarker() locationSuccess(location) @@ -1069,7 +1069,7 @@ abstract class BaseGoogleMapFragment : LogUtil.e("requestCurrentLocation $result") if (null != location) { - mUserLatLng = LatLng(location.latitude, location.longitude) + setUserLatLng(location) if (isLocationSuccessCallback) locationSuccess(location) isLocationSuccessCallback = false } @@ -1079,6 +1079,16 @@ abstract class BaseGoogleMapFragment : } } + private fun setUserLatLng(location: Location) { + location.apply { + MMKVUtil.putDouble(MMKVKey.UserGpsLat, latitude) + MMKVUtil.putDouble(MMKVKey.UserGpsLon, longitude) + //单位是米/秒(m/s) + MMKVUtil.putFloat(MMKVKey.UserGpsSpeed, speed) + mUserLatLng = LatLng(latitude, longitude) + } + } + //*************************定位代码end**************************************** /** diff --git a/app/src/main/java/com/abbidot/tracker/util/SocketUtilManageV2.kt b/app/src/main/java/com/abbidot/tracker/util/SocketUtilManageV2.kt deleted file mode 100644 index 97e0fda..0000000 --- a/app/src/main/java/com/abbidot/tracker/util/SocketUtilManageV2.kt +++ /dev/null @@ -1,131 +0,0 @@ -package com.abbidot.tracker.util - -import android.content.Context -import com.abbidot.baselibrary.util.AppUtils -import com.abbidot.baselibrary.util.LogUtil -import com.abbidot.tracker.util.bluetooth.SRBleCmdUtil -import com.abbidot.tracker.util.bluetooth.SRBleUtil -import com.clj.fastble.utils.HexUtil -import com.easysocket.EasySocket -import com.easysocket.config.EasySocketOptions -import com.easysocket.entity.OriginReadData -import com.easysocket.entity.SocketAddress -import com.easysocket.interfaces.conn.ISocketActionListener -import java.util.Timer -import kotlin.concurrent.timerTask - - -/** - *Created by .yzq on 2025/4/18/018. - * @link - * @description: - */ -class SocketUtilManageV2 { - - private var mNeedSendMessage = byteArrayOf() - private val mTimer = Timer() - private var mMac = "" - - @Synchronized - fun initEasySocket(context: Context, mac: String, data: ByteArray) { -// try { -// val data1 = SRBleCmdUtil.instance.byteToInt(data[1]) -// val data2 = SRBleCmdUtil.instance.byteToInt(data[2]) -// val data3 = SRBleCmdUtil.instance.byteToInt(data[3]) -// val data4 = SRBleCmdUtil.instance.byteToInt(data[4]) -// val ip = "$data1.$data2.$data3.$data4" -// val port = SRBleCmdUtil.instance.byte2ArrayToInt(data.sliceArray(5..6)) -// val socketAddress = "$ip:$port" -// LogUtil.e(socketAddress) -// mMac = mac -// mNeedSendMessage = data.sliceArray(8..data.size - 2) -// initEasySocket(context, ip, port) -// } catch (e: Exception) { -// LogUtil.e("initEasySocket 异常:${e.message}") -// } - } - - /** - * 初始化EasySocket - */ - private fun initEasySocket(context: Context, ip: String, port: Int) { - //socket配置 - val options = EasySocketOptions.Builder().setSocketAddress(SocketAddress(ip, port)) - .setMaxWriteBytes(300) - // 强烈建议定义一个消息协议,方便解决 socket黏包、分包的问题 - // .setReaderProtocol(new DefaultMessageProtocol()) // 默认的消息协议 - .build() - //初始化EasySocket - EasySocket.getInstance().createConnection(options, context).setDebug(AppUtils.isDebug()) -// EasySocket.getInstance().createSpecifyConnection(options, context) - - //监听socket相关行为 - EasySocket.getInstance().subscribeSocketAction(object : ISocketActionListener { - override fun onSocketConnSuccess(socketAddress: SocketAddress?) { - try { - mTimer.cancel() - LogUtil.e("socket连接成功") - //发送 - mTimer.schedule(timerTask { - LogUtil.e("发送") - EasySocket.getInstance().upMessage(mNeedSendMessage) - }, 500) - } catch (e: Exception) { - LogUtil.e("onSocketConnSuccess 异常:${e.message}") - } - } - - override fun onSocketConnFail(socketAddress: SocketAddress?, isNeedReconnect: Boolean) { - LogUtil.e("socket连接失败,是否需要重连:$isNeedReconnect") - replyBleResult(1, null) - } - - override fun onSocketDisconnect( - socketAddress: SocketAddress?, isNeedReconnect: Boolean - ) { - LogUtil.e("socket断开连接,是否需要重连:$isNeedReconnect") - } - - override fun onSocketResponse( - socketAddress: SocketAddress?, originReadData: OriginReadData? - ) { - LogUtil.d("socket监听器收到对象数据=" + originReadData?.bodyString) - } - - override fun onSocketResponse(socketAddress: SocketAddress?, readData: String?) { - LogUtil.d("socket监听器收到字符串数据=$readData") - } - - override fun onSocketResponse(socketAddress: SocketAddress?, readData: ByteArray?) { - val data = HexUtil.formatHexString(readData, true) - LogUtil.e("socket监听器收到字节数组数据=$data") - readData?.apply { - if (size > 16 && this[15] == (0x94).toByte()) { - replyBleResult(0, this) - } - } - } - }) - } - - private fun replyBleResult(result: Int, data: ByteArray?) { - SRBleUtil.instance.getConnectMacDevice(mMac)?.let { - SRBleUtil.instance.writeData( - it.bleDevice, SRBleCmdUtil.instance.setProxy(result, data) - ) - } - destroy() - } - - private fun destroy() { - try { - //destroyConnection()代表销毁整个连接状态,跟disconnect()不一样,如果此时要进行socket连接需要重新创建一个连接 - EasySocket.getInstance().destroyConnection() - //注销监听socket相关行为 - EasySocket.getInstance().defOptions.reconnectionManager.detach() - LogUtil.e("socket销毁连接") - } catch (e: Exception) { - LogUtil.e("socket销毁连接异常:${e.message}") - } - } -} \ No newline at end of file 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 d393b8f..9d5fb83 100644 --- a/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt +++ b/app/src/main/java/com/abbidot/tracker/util/ViewUtil.kt @@ -984,33 +984,13 @@ class ViewUtil private constructor() { } } - /** - * 跳转隐私政策 + * 适配不同语言跳转h5 */ - fun goPrivacyPolicy(activity: Activity) { - val url = if (AppUtils.isChina()) { - "file:///android_asset/privacy_cn.html" - } else { - "file:///android_asset/privacy_en.html" - } - WebViewActivity.startWebViewActivity( - activity, activity.getString(R.string.txt_privacy_policy), url - ) - } - - /** - * 跳转服务协议 - */ - fun goServiceContract(activity: Activity) { - val url = if (AppUtils.isChina()) { - "file:///android_asset/terms_cn.html" - } else { - "file:///android_asset/terms_en.html" - } - WebViewActivity.startWebViewActivity( - activity, activity.getString(R.string.txt_service_contract), url - ) + fun goHtmlAssetContent(activity: Activity, title: String, fileKey: String) { + val url="file:///android_asset/$fileKey" + LogUtil.e(url) + WebViewActivity.startWebViewActivity(activity, title, url) } /** diff --git a/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleCmdUtil.kt b/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleCmdUtil.kt index 84a5325..8a92584 100644 --- a/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleCmdUtil.kt +++ b/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleCmdUtil.kt @@ -1,6 +1,8 @@ package com.abbidot.tracker.util.bluetooth import android.text.TextUtils +import com.abbidot.baselibrary.constant.MMKVKey +import com.abbidot.baselibrary.util.MMKVUtil import com.abbidot.tracker.bean.FencesBean import com.abbidot.tracker.bean.WiFiZoneBean import com.abbidot.tracker.constant.ConstantInt @@ -368,6 +370,9 @@ class SRBleCmdUtil private constructor() { return getCrc8Cmd(byteArray) } + /** + * 获取手机定位信息 + */ fun getPhoneLocation(lat: Double, lon: Double): ByteArray { var byteArray = byteArrayOf(0x23, CMD_READ.toByte(), 0) byteArray = byteArray.plus(longTo4ByteArray((lon * 1000000).toLong())) @@ -387,5 +392,20 @@ class SRBleCmdUtil private constructor() { return getCrc8Cmd(byteArray) } } + + /** + * 刷新定位 + */ + fun refreshLocation(lat: Double, lon: Double): ByteArray { + var byteArray = byteArrayOf(0x2C, CMD_WRITE.toByte()) + byteArray = byteArray.plus(longTo4ByteArray((lon * 1000000).toLong())) + byteArray = byteArray.plus(longTo4ByteArray((lat * 1000000).toLong())) + //单位是米/秒(m/s) + val userGpsSpeed = MMKVUtil.getFloat(MMKVKey.UserGpsSpeed) + // 换算成 km/h + val speedKmh = userGpsSpeed * 3.6 + byteArray = byteArray.plus(longTo2ByteArray((speedKmh * 100).toLong())) + return getCrc8Cmd(byteArray) + } } diff --git a/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleUtil.kt b/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleUtil.kt index d68fd6e..9d7b27c 100644 --- a/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleUtil.kt +++ b/app/src/main/java/com/abbidot/tracker/util/bluetooth/SRBleUtil.kt @@ -12,13 +12,14 @@ import android.text.TextUtils import androidx.core.app.ActivityCompat.startActivityForResult import com.abbidot.baselibrary.constant.ConState import com.abbidot.baselibrary.constant.EventName +import com.abbidot.baselibrary.constant.MMKVKey import com.abbidot.baselibrary.eventbus.XEventBus import com.abbidot.baselibrary.util.AppUtils import com.abbidot.baselibrary.util.LogUtil +import com.abbidot.baselibrary.util.MMKVUtil import com.abbidot.tracker.base.BaseActivity import com.abbidot.tracker.bean.BleTrackDeviceBean import com.abbidot.tracker.bean.ReceiveDeviceData -import com.abbidot.tracker.util.SocketUtilManageV2 import com.abbidot.tracker.util.Util import com.clj.fastble.BleManager import com.clj.fastble.callback.BleGattCallback @@ -47,7 +48,6 @@ class SRBleUtil private constructor() { //人为停止扫描设备,扫描中断 var isScanInterrupt = false - private var mSocketUtilManage: SocketUtilManageV2? = null /** * Bluetooth_Base_UUID定义为 00000000-0000-1000-8000-00805F9B34FB @@ -239,7 +239,14 @@ class SRBleUtil private constructor() { ) } else if (data0 == 0x23 && data1 == 0x00) { LogUtil.e("${bleDevice.mac},获取手机定位") - XEventBus.post(EventName.BleGetLocation, bleDevice.mac) + val userGpsLat = MMKVUtil.getDouble(MMKVKey.UserGpsLat) + val userGpsLon = MMKVUtil.getDouble(MMKVKey.UserGpsLon) + if (userGpsLat != 0.0 || userGpsLon != 0.0) { + writeData( + bleDevice, + SRBleCmdUtil.instance.getPhoneLocation(userGpsLat, userGpsLon) + ) + } } else if (data0 == 0x24) { LogUtil.e("${bleDevice.mac},蓝牙透传消息") val deviceData = ReceiveDeviceData(bleDevice, data, bleDevice.mac) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index cc0cf99..b757257 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -993,4 +993,7 @@ Hinzufügen Bereits auf Mindestgröße Alle Haustiere anzeigen + terms_de.html + privacy_de.html + subscription_terms_conditions_de.html \ 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 85a629d..620a801 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -981,5 +981,8 @@ Ajouter Taille minimale atteinte Afficher tous les animaux + terms_fr.html + privacy_fr.html + subscription_terms_conditions_fr.html \ 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 3742d72..6297885 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -1011,5 +1011,8 @@ 显示所有宠物 请使用有效的手机号码 账户 + terms_zh.html + 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 2e2668d..77e48b5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1084,5 +1084,8 @@ Display All Pets Please use a valid phone number Account + terms_en.html + privacy_en.html + subscription_terms_conditions_en.html \ No newline at end of file diff --git a/baselibrary/src/main/java/com/abbidot/baselibrary/constant/EventName.kt b/baselibrary/src/main/java/com/abbidot/baselibrary/constant/EventName.kt index 413f5c8..2dce1c3 100644 --- a/baselibrary/src/main/java/com/abbidot/baselibrary/constant/EventName.kt +++ b/baselibrary/src/main/java/com/abbidot/baselibrary/constant/EventName.kt @@ -39,7 +39,6 @@ import androidx.annotation.StringDef EventName.BluetoothSwitch, EventName.BleReport, EventName.BleFirmwareVersion, - EventName.BleGetLocation, EventName.BleReportData, EventName.LogReport, EventName.BlePassThrough, @@ -108,11 +107,9 @@ annotation class EventName { //日志上报数据 const val LogReport = "logReport" - //设备获取手机位置 - const val BleGetLocation = "bleGetLocation" - //设备固件版本 const val BleFirmwareVersion = "firmwareVersion" + //蓝牙透传 const val BlePassThrough = "blePassThrough" } diff --git a/baselibrary/src/main/java/com/abbidot/baselibrary/constant/MMKVKey.kt b/baselibrary/src/main/java/com/abbidot/baselibrary/constant/MMKVKey.kt index 3b080ac..aa9f8fc 100644 --- a/baselibrary/src/main/java/com/abbidot/baselibrary/constant/MMKVKey.kt +++ b/baselibrary/src/main/java/com/abbidot/baselibrary/constant/MMKVKey.kt @@ -41,6 +41,9 @@ import androidx.annotation.StringDef MMKVKey.ShowAllPet, MMKVKey.isCrash, MMKVKey.AvailableOrder, + MMKVKey.UserGpsLat, + MMKVKey.UserGpsLon, + MMKVKey.UserGpsSpeed, MMKVKey.isFirstCheckBleOpen, MMKVKey.Shared ) @@ -90,6 +93,11 @@ annotation class MMKVKey { const val MapShowDefaultLat = "mapDefaultLat" const val MapShowDefaultLon = "mapDefaultLon" + //手机Gps定位信息 + const val UserGpsLat = "userGpsLat" + const val UserGpsLon = "userGpsLon" + const val UserGpsSpeed = "userGpsSpeed" + //地图模式类型 const val MapType = "mapType" 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 be36697..bff2f36 100644 --- a/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt +++ b/baselibrary/src/main/java/com/abbidot/baselibrary/util/AppUtils.kt @@ -18,7 +18,7 @@ class AppUtils { companion object { -// private var isDebug: Boolean? = true + // private var isDebug: Boolean? = true private var isDebug: Boolean? = null /** @@ -103,7 +103,7 @@ class AppUtils { return MMKVUtil.getBoolean(MMKVKey.DebugIp, true) } val locale = Locale.getDefault() - val lang = locale.language.uppercase() + "-" + locale.country.uppercase() + val lang = locale.country.uppercase() + "-" + locale.language.uppercase() return lang.contains("CN") || lang.contains("ZH") }