修复问题
huangwei 9 months ago
parent 66fa481a05
commit eea43ea0da
  1. BIN
      aar/base/base-release.aar
  2. 2
      aar/level/build.gradle
  3. BIN
      aar/level/level-release.aar
  4. 2
      aar/rtk/build.gradle
  5. BIN
      aar/rtk/rtk-release.aar
  6. 2
      aar/totalstation/build.gradle
  7. BIN
      aar/totalstation/totalstation-release.aar
  8. 5
      app/build.gradle
  9. 6
      app/src/main/AndroidManifest.xml
  10. 8
      app/src/main/assets/agreement_policy_summary.xml
  11. 4
      app/src/main/assets/agreement_policy_summary_en.xml
  12. 170
      app/src/main/assets/privacyPolicy.xml
  13. 45
      app/src/main/assets/privacyPolicy_en.xml
  14. 117
      app/src/main/assets/userAgreement.xml
  15. 116
      app/src/main/assets/userAgreement_en.xml
  16. 1
      app/src/main/java/com/bingce/controlnetwork/App.java
  17. 4
      app/src/main/java/com/bingce/controlnetwork/activity/AboutActivity.java
  18. 132
      app/src/main/java/com/bingce/controlnetwork/activity/MainActivity.java
  19. 16
      app/src/main/java/com/bingce/controlnetwork/activity/SplashActivity.java
  20. 22
      app/src/main/java/com/bingce/controlnetwork/activity/backup/AbstractBackupExportActivity.java
  21. 27
      app/src/main/java/com/bingce/controlnetwork/activity/backup/launch/MigrationFolder2PrivateRoomActivity.java
  22. 216
      app/src/main/java/com/bingce/controlnetwork/activity/user/RegisterActivity.java
  23. 781
      app/src/main/java/com/bingce/controlnetwork/activity/user/UserInfoActivity.java
  24. 30
      app/src/main/java/com/bingce/controlnetwork/fragment/ProjectToleranceSettingFragment.java
  25. 7
      app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordFragment.java
  26. 2
      app/src/main/java/com/bingce/controlnetwork/fragment/SelectExportSurveyorRecordWireFileFragment.java
  27. 8
      app/src/main/java/com/bingce/controlnetwork/func/level/export/LevelExportSingalHeight.kt
  28. 3
      app/src/main/java/com/bingce/controlnetwork/func/level/fragment/ProjectDetailLevelFragment.java
  29. 42
      app/src/main/java/com/bingce/controlnetwork/func/level/idetection/LevelIDetectionRecordActivity.kt
  30. 20
      app/src/main/java/com/bingce/controlnetwork/func/level/idetection/viewmodel/LevelIDetectionRecordVm.kt
  31. 4
      app/src/main/java/com/bingce/controlnetwork/func/level/util/LevelExportUtilTj.kt
  32. 12
      app/src/main/java/com/bingce/controlnetwork/newui/adapter/BaseAdapterNew.java
  33. 2
      app/src/main/java/com/bingce/controlnetwork/newui/configfragment/SelectMeasureDataExportTypeFragment.java
  34. 17
      app/src/main/java/com/bingce/controlnetwork/newui/mefragment/MeFragment.kt
  35. 85
      app/src/main/java/com/bingce/controlnetwork/surveyor/method/ExportUtilsPla.java
  36. 12
      app/src/main/java/com/bingce/controlnetwork/surveyor/state/angledistance/_DoSurveyorState.java
  37. 13
      app/src/main/java/com/bingce/controlnetwork/surveyor/state/heighttraverse/_DoSurveyorState.java
  38. 21
      app/src/main/java/com/bingce/controlnetwork/ui/WechatImagePicker.java
  39. 67
      app/src/main/java/com/bingce/controlnetwork/util/CheckRegUtil.java
  40. 3
      app/src/main/res/layout/activity_activate.xml
  41. 119
      app/src/main/res/layout/activity_export_layout.xml
  42. 243
      app/src/main/res/layout/activity_migration_2_private_folder_layout.xml
  43. 7
      app/src/main/res/layout/fragment_line_surveyor_station_setup_layout.xml
  44. 4
      app/src/main/res/layout/fragment_tolerance_select_framelayout_layout.xml
  45. 75
      app/src/main/res/layout/item_about_tj_one.xml
  46. 4
      app/src/main/res/layout/item_station_left_right.xml
  47. 4
      app/src/main/res/layout/item_station_setting_common.xml
  48. 2
      app/src/main/res/layout/new_fragment_config.xml
  49. 4
      app/src/main/res/raw/changelog.xml
  50. 2
      app/src/main/res/values-zh/strings.xml
  51. 1
      app/src/main/res/values/strings.xml
  52. 12
      app/src/main/res/xml/prefs.xml
  53. 17
      build.gradle
  54. 32
      buildSrc/src/main/java/com/bingce/kotlin/com/bingce/ModuleName.kt
  55. 1
      buildSrc/src/main/java/com/bingce/kotlin/com/bingce/dependencies.kt
  56. 2
      control_common
  57. 32
      settings.gradle

Binary file not shown.

@ -0,0 +1,2 @@
configurations.maybeCreate("default")
artifacts.add("default", file('level-release.aar'))

Binary file not shown.

@ -0,0 +1,2 @@
configurations.maybeCreate("default")
artifacts.add("default", file('rtk-release.aar'))

Binary file not shown.

@ -0,0 +1,2 @@
configurations.maybeCreate("default")
artifacts.add("default", file('totalstation-release.aar'))

@ -18,8 +18,7 @@ android {
defaultConfig {
versionName "1.0.1"
versionCode 1
// applicationId "com.bingce.controlnetwork.pla"
applicationId "com.bingce.controlnetwork"
applicationId "com.bingce.controlnetwork.pla"
minSdkVersion AndroidSdk.minSdkVersion
targetSdkVersion AndroidSdk.targetSdkVersion
ndk {}
@ -122,7 +121,7 @@ dependencies {
implementation project(moduleName.openSourceModule("agentweb"))
implementation project(":opensource:exFilePicker")
implementation project(":sdk:tensorFlowTTS")//
implementation Libs.RxImagePicker.core
// implementation Libs.RxImagePicker.core
// implementation Libs.RxImagePicker.support
// implementation Libs.RxImagePicker.supportWechat

@ -130,8 +130,9 @@
android:name=".activity.backup.BackupExportActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true"
android:label="@string/backup" />
android:label="数据备份" />
<activity
android:label="数据导入"
android:name=".activity.backup.launch.MigrationFolder2PrivateRoomActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true" />
@ -198,7 +199,8 @@
<activity
android:name=".func.level.activity.LevelStationSettingActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:exported="true" />
android:exported="true"
android:label="@string/surveyor_route_setting" />
<activity
android:name=".func.level.idetection.LevelIDetectionRecordActivity"
android:configChanges="orientation|keyboardHidden|screenSize"

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<summary>
欢迎使用导线助手App!我们将通过《用户协议》和《隐私政策》帮助您了解我们收集、使用、存储和共享个人信息的情况,以及您所享有的相关权利。
• 为了向您提供语音播报、文件生成存储、头像上传、用户注册等功能服务,我们需要使用您的一些存储权限、音视频录制权限、相机权限、获取设备信息等权限及信息。
• 我们会采用业界领先的安全技术保护好您的个人信息。
您可以通过阅读完整版用户隐私政策,了解个人信息类型与用途的对应关系等更加详尽的个人信息处理规则。
如您同意,请点击“同意”开始接受我们的服务。
</summary>

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<summary>
Welcome to the Surveyor App! Through the "User Agreement" and "Privacy Policy", we will help you understand our collection, use, storage and sharing of personal information, as well as your related rights. • In order to provide you with voice broadcasting, file generation and storage, avatar upload, user registration and other functional services, we need to use some of your storage permissions, audio and video recording permissions, camera permissions, access to device information and other permissions and information. • We will protect your personal information with industry-leading security technology. You can read the full version of the user's privacy policy to understand the more detailed personal information processing rules such as the correspondence between personal information types and uses. If you agree, please click "Agree" to start accepting our services.
</summary>

@ -1,170 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<content>
本政策仅适用于河南冰测科技有限公司的导线助手产品或服务。 最近更新日期:2023年9月8日。
本政策将帮助您了解以下内容:
一、我们如何收集和使用您的用户信息
二、我们如何使用 Cookie 和同类技术
三、我们如何共享、转让、公开披露您的用户信息
四、我们如何保护您的用户信息
五、您的权利
六、您的用户信息如何储存及如何在全球范围转移
七、本政策如何更新
八、如何联系我们
我们深知用户信息对您的重要性,并会尽全力保护您的用户信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的用户信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的用户信息。
请在使用我们的产品(或服务)前,仔细阅读并了解本隐私政策。
一、我们如何收集和使用您的用户信息
(一)您使用我司产品或服务过程中我们收集和使用的信息
我们仅会出于本政策所述的业务功能,收集和使用您的用户信息,收集用户信息的目的在于向您提供产品或服务,您有权自行选择是否提供该信息,但多数情况下,如果您不提供,我们可能无法向您提供相应的服务,也无法回应您遇到的问题:
在您使用我们的服务时,允许我们收集您自行向我们提供的或为向您提供服务所必要的信息包括:账号密码信息、电子邮件地址、手机号码、设备信息、外接设备连接信息、设备信息(IMEI/MAC/Android ID/IDFA/OpenUDID/GUID/IP地址/SIM 卡 IMSI 信息等)、位置信息、网络身份标识信息、应用列表、剪切板、读写存储设备SD卡。
以下对我们用到的信息做详细说明:
1.您的账号密码信息将被用来登录您的账户,保证您个人数据的安全,防止被其他用户盗用。
2.您的邮箱地址将被用来做为登录方式之一,也可以做为找回、重置账户密码的方式。
3.您的手机号将被用来作为登录方式之一,也可以用来作为找回、重置账户密码的方式。
4.您的设备信息将被用来优化软件的适配,比如手机的屏幕分辨率可以优化软件界面的布局、手机网络模式用来优化节约用户流量信息。
5.您的外接设备连接信息和外接设备状态将被用来优化软件与第三方设备的适配,比如外接gps、北斗定位设备时,可以通过设备型号,发送不同的通信指令,以便提高通讯的可靠性。
6.您的位置信息将被用来识别定位差分信息,我们的软件为了提高定位精度,采用的gps、北斗等卫星定位系统差分技术,此技术可以将定位精度提高到厘米级,但是此技术需要把用户的位置信息传送到差分服务提供商的服务器,以便获取合适的差分数据。同时,软件为了连接第三方gps、北斗设备,需要用蓝牙通讯,而蓝牙搜索时,安卓系统需要使用定位权限,因此,蓝牙搜索连接也会需要定位权限。
7.您的网络身份标识信息将被用来降低账号的异地登录、盗号等风险。
8.您的应用列表信息将被用来验证是否安装我们公司开发的其他软件,以便我司软件间的数据共享、调用。
9.您的剪切板信息将被用来在软件不同的界面间,快捷复制粘贴数据,提供您的工作效率。
10.读写存储SD卡权限将被用于读取CAD文件、读取用户要导入的文件、保存用户导出的私人数据、备份用户的私人数据。
您提供的上述信息,将在您使用本服务期间持续授权我们使用。在您停止使用推送服务时,我们将停止使用并删除上述信息。
我们保证会依法对收集后的用户信息进行去标识化或匿名化处理,对于无法单独或者与其他信息结合识别自然人个人身份的信息,不属于法律意义上的个人信息。如果我们将非个人信息与其他信息结合识别到您的个人身份时,或者与您的个人信息结合使用时,我们会在结合使用期间,将此类信息作为您的个人信息按照本隐私政策对其进行处理和保护。
为了更好运营和改善我们的技术和服务,或出于商业策略的变化,当我们提供的产品或服务所需的用户信息收集、使用、处理超出上述范围或者要将收集到的用户信息用于本隐私政策未载明的其他用途,或当我们要将基于特定目的收集而来的信息用于其他目的时,我们会在获取用户信息后的合理期限内或处理用户信息前通知您,并获得您的授权同意。
(二)征得授权同意的例外
请您理解,根据法律法规及相关国家标准,以下情形中,我们收集和使用您的用户信息无需征得您的授权同意:
1、与国家安全、国防安全直接相关的;
2、与公共安全、公共卫生、重大公共利益直接相关的;
3、与犯罪侦查、起诉、审判和判决执行等直接相关的;
4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
5、所收集的您的用户信息是您自行向社会公众公开的;
6、从合法公开披露的信息中收集的您的用户信息,如合法的新闻报道、政府信息公开等渠道;
7、根据您的要求签订或履行合同所必需的;
8、用于维护软件及相关服务的安全稳定运行所必需的,例如发现、处置软件及相关服务的故障;
9、 个人信息控制者为新闻单位且其在开展合法的新闻报道所必需的;
10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的。
11、法律法规规定的其他情形。
二、我们如何使用 Cookie 和同类技术
(一)Cookie
为确保网站正常运转,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie 通常包含标识符、站点名称以及一些号码和字符。借助于 Cookie,网站能够存储您的访问偏好数据。
我们不会将 Cookie 用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除 Cookie。您可以清除计算机上保存的所有 Cookie,大部分网络浏览器都设有阻止Cookie 的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。
(二)网站信标和像素标签
除 Cookie 外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的点击URL。
如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善客户服务。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。
(三)Do Not Track(请勿追踪)
很多网络浏览器均设有Do Not Track功能,该功能可向网站发布Do Not Track请求。目前,主要互联网标准组织尚未设立相关政策来规定网站应如何应对此类请求。但如果您的浏览器启用了 Do Not Track,那么我们的所有网站都会尊重您的选择。
三、我们如何共享、转让、公开披露您的用户信息
(一)共享
我们不会与其他的任何公司、组织和个人分享您的用户信息,但以下情况除外:
1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的用户信息。
2、我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的用户信息。
3、与我们的关联公司共享:您的用户信息可能会与我们的关联公司共享。我们只会共享必要的用户信息,且受本隐私政策中所声明目的的约束。关联公司如要改变用户信息的处理目的,将再次征求您的授权同意。
4、与授权合作伙伴共享:仅为实现本政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些用户信息,以提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的用户信息,并且只会共享提供服务所必要的用户信息。为了更好运营和改善技术和服务,您同意我们和授权合作伙伴在符合相关法律法规的前提下可将收集的信息用于其他服务和用途。
以下列举了具体的授权合作伙伴,并提供了该第三方的隐私政策链接,我们建议您阅读该第三方的隐私政策:
(一)统计服务供应商:由北京锐讯灵通科技有限公司提供统计技术服务,我们可能会收集您的设备信息(IMEI/MAC/Android ID/IDFA/OpenUDID/GUID/IP地址/SIM 卡 IMSI 信息等)提供给北京锐讯灵通科技有限公司,用于为您提供统计技术服务。详细内容请访问《友盟统计隐私政策》。友盟统计隐私政策链接:https://www.umeng.com/page/policy
(二)广告、媒体:我们可能会将收集到的信息共享给广告、媒体以及我们的其他授权合作伙伴,用于包括优化广告投放和提升营销效果等商业化用途。
(三)推送服务供应商:由美味书签(北京)信息技术有限公司提供推送技术服务,我们可能会将您的设备平台、设备厂商、设备品牌、设备识别码等设备信息,应用列表信息、网络信息以及位置相关信息提供给美味书签(北京)信息技术有限公司,用于为您提供推送技术服务。
对我们与之共享用户信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理用户信息。
(二)转让
我们不会将您的用户信息转让给任何公司、组织和个人,但以下情况除外:
1、在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的用户信息;
2、在涉及合并、收购或破产清算时,如涉及到用户信息转让,我们会再要求新的持有您用户信息的公司、组织继续受此隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。
(三)公开披露
我们仅会在以下情况下,公开披露您的用户信息:
1、获得您明确同意后;
2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的用户信息。
(四)共享、转让、公开披露信息时事先征得授权同意的例外
请您理解,根据法律法规及相关国家标准,以下情形中,我们共享、转让、公开披露您的用户信息无需征得您的授权同意:
1、与国家安全、国防安全直接相关的;
2、与公共安全、公共卫生、重大公共利益直接相关的;
3、与犯罪侦查、起诉、审判和判决执行等直接相关的;
4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
5、您自行向社会公众公开的信息;
6、从合法公开披露的信息中收集的,如合法的新闻报道、政府信息公开等渠道。
四、我们如何保护您的用户信息
(一)我们已使用符合业界标准的安全防护措施保护您提供的用户信息,防止数据遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的用户信息。例如,在您的浏览器与“服务”之间交换数据时受 SSL 加密保护;我们同时对网站提供https安全浏览方式;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问用户信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护用户信息重要性的认识。
(二)我们会采取一切合理可行的措施,确保未收集无关的用户信息。我们只会在达成本政策所述目的所需的期限内保留您的用户信息,除非需要延长保留期或受到法律的允许。
(三)互联网并非绝对安全的环境,而且电子邮件、即时通讯、及与其他用户的交流方式并未加密,我们强烈建议您不要通过此类方式发送用户信息。
(四)互联网环境并非百分之百安全,我们将尽力确保您发送给我们的任何信息的安全性。即使我们做出了很大努力,采取了一切合理且必要的措施,仍然有可能无法杜绝您的用户信息被非法访问、被非法盗取,被非法篡改或毁坏,导致您的合法权益受损,请您理解信息网络的上述风险并自愿承担。
(五)在不幸发生用户信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知用户信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报用户信息安全事件的处置情况。
五、您的权利
按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的用户信息行使以下权利:
(一)访问您的用户信息
您有权访问您的用户信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:www.bingce.com
如果您无法通过上述链接访问这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至liu@bingce.com。我们将在30天内回复您的访问请求。
对于您在使用我们的产品或服务过程中产生的其他用户信息,只要我们不需要过多投入,我们会向您提供。如果您想行使数据访问权,请发送电子邮件至liu@bingce.com。
(二)更正您的用户信息
当您发现我们处理的关于您的用户信息有错误时,您有权要求我们作出更正。您可以通过“(一)访问您的用户信息”中罗列的方式提出更正申请。 如果您无法通过上述链接更正这些用户信息,您可以随时使用我们的 Web 表单联系,或发送电子邮件至liu@bingce.com。我们将在30天内回复您的更正请求。
(三)删除您的用户信息
在以下情形中,您可以向我们提出删除用户信息的请求:
1、如果我们处理用户信息的行为违反法律法规;
2、如果我们收集、使用您的用户信息,却未征得您的同意;
3、如果我们处理用户信息的行为违反了与您的约定;
4、如果您不再使用我们的产品或服务,或您注销了账号;
5、如果我们不再为您提供产品或服务。
我们将会根据您的删除请求进行评估,若满足相应规定,我们将会采取相应步骤进行处理。当您向我们提出删除请求时,我们可能会要求您进行身份验证,以保障账户的安全。当您从我们的服务中删除信息后,因为适用的法律和安全技术,我们可能不会立即从备份系统中删除相应的信息,我们将安全存储您的信息直到备份可以清除或实现匿名化。
(四)改变您授权同意的范围
每个业务功能需要一些基本的用户信息才能得以完成(见本政策“第一部分”)。对于用户信息的收集和使用,您可以随时给予或收回您的授权同意。您可以通过以下方式自行操作:在安卓系统设置应用管理中找到本应用,找到权限管理,可以打开或关闭某些权限。
当您收回同意后,我们将不再处理相应的用户信息。同时也请您注意,您撤销授权同意可能会导致某些后果,例如我们可能无法继续为您提供相应的服务或特定的功能,但您收回同意的决定,不会影响此前基于您的授权而开展的用户信息处理。
(五)用户信息主体注销账户
您随时可注销此前注册的账户,您可以通过以下方式操作:发送邮件到liu@bingce.com,我们将提供人工服务。在注销账户之后,我们将停止为您提供产品或服务并依据您的要求,删除或匿名化您的信息,法律法规另有规定的除外。这也将可能导致您失去对您账户中数据的访问权,请您谨慎操作。
(六)用户信息主体获取用户信息副本
您有权获取您的用户信息副本,您可以通过以下方式操作:发送邮件到liu@bingce.com,我们将提供人工服务。在技术可行的前提下,例如数据接口匹配,我们还可按您的要求,直接将您的用户信息副本传输给您指定的第三方。
(七)约束信息系统自动决策
在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制作出决定。如果这些决定显著影响您的合法权益,您有权要求我们作出解释,我们也将提供适当的救济方式。
(八)响应您的上述请求
为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。
我们将在三十天内作出答复。如您不满意,还可以通过以下途径投诉:向有关部门投诉。对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。也请您理解,出于安全保障的考虑、相关法律法规的要求或技术上的限制,对于您的某些请求我们可能无法做出响应,例如以下情形:
1、与用户信息控制者履行法律法规规定的义务相关的;
2、与国家安全、国防安全直接相关的;
3、与公共安全、公共卫生、重大公共利益直接相关的;
4、与犯罪侦查、起诉、审判和执行判决等直接相关的;
5、用户信息控制者有充分证据表明用户信息主体存在主观恶意或滥用权利的;
6、出于维护用户信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
7、响应用户信息主体的请求将导致用户信息主体或其他个人、组织的合法权益受到严重损害的;
8、涉及商业秘密的。
六、您的用户信息如何储存以及如何在全球范围转移
原则上,我们在中华人民共和国境内收集和产生的用户信息,将存储在中华人民共和国境内。我们只会在本政策所述目的和用途所需的期限内和法律法规规定的最短期限内保留您的用户信息,超出上述保留期间后,我们会根据适用法律法规的要求删除您的用户信息或匿名化处理。法律法规另有规定,或出于公共利益、科学历史研究等的目的,或您的另行授权同意的除外,我们可能需要较长时间保留相关数据。
由于我们通过遍布全球的资源和服务器提供产品或服务,这意味着,在获得您的授权同意后,您的用户信息可能会被转移到您使用产品或服务所在国家/地区的境外管辖区,或者受到来自这些管辖区的访问。
此类管辖区可能设有不同的数据保护法,甚至未设立相关法律。在此类情况下,我们会确保您的用户信息得到在中华人民共和国境内足够同等的保护。例如,我们会请求您对跨境转移用户信息的同意,或者在跨境数据转移之前实施数据去标识化等安全举措。
七、本政策如何更新
我们的隐私政策可能变更。未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更。
对于重大变更,我们还会提供更为显著的通知。本政策所指的重大变更包括但不限于:
1、我们的服务模式发生重大变化。如处理用户信息的目的、处理的用户信息类型、用户信息的使用方式等;
2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
3、用户信息共享、转让或公开披露的主要对象发生变化;
4、您参与用户信息处理方面的权利及其行使方式发生重大变化;
5、我们负责处理用户信息安全的责任部门、联络方式及投诉渠道发生变化时;
6、用户信息安全影响评估报告表明存在高风险时。
我们还会将本政策的旧版本存档,供您查阅。
八、如何联系我们
如果您对本隐私政策有任何疑问、意见或建议,通过以下方式与我们联系:
电子邮件:liu@bingce.com
  话:13657190002
我们设立了用户信息保护专职部门,您可以通过以下方式与相关人员联系:liu@bingce.com
一般情况下,我们将在三十天内回复。
如果您对我们的回复不满意,特别是我们的用户信息处理行为损害了您的合法权益,您还可以通过以下外部途径寻求解决方案:向有关部门投诉。
</content>

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<content>
This application respects and protects the personal privacy of all users of the service. In order to provide you with more accurate and personalized services, this application will use and disclose your personal information in accordance with the provisions of this privacy policy. However, this application will treat this information with a high degree of diligence and prudence. Except as otherwise provided in this Privacy Policy, this application will not disclose this information to third parties or provide it to third parties without your prior permission. This app will update this privacy policy from time to time.
When you agree to this application service use agreement, you are deemed to have agreed to the entire content of this privacy policy. This privacy policy is an integral part of this application service usage agreement.
Scope of application
(a) when you register for this application account, the personal registration information you provided in accordance with the requirements of this application;
(b)
When you use this application web service or visit this application platform web page, this application automatically receives and records information on your browser and computer, including but not limited to your IP address, browser type, language used , Access date and time, software and hardware characteristic information, and web page records such as your requirements;
(c) User personal data obtained by this application from business partners through legal channels.
You understand and agree that the following information does not apply to this privacy policy:
(a) the keyword information you enter when using the search services provided by this application platform;
(b) relevant information and data collected by this application and released by you in this application, including but not limited to participation activities, transaction information and evaluation details;
(c) Violations of laws or violations of this application rule and the actions this application has taken against you.
2. Use of information
(a) This application will not provide, sell, rent, share or trade your personal information to any unrelated third party, unless you have obtained your permission in advance, or the third party and this application (including this application affiliate) alone or jointly To provide you with a service, and after the service has ended, it will be barred from access to all of this material, including its previous access.
(b) This application also does not allow any third party to collect, edit, sell or disseminate your personal information by any means. If any user of this application platform engages in the above activities, once found, this application has the right to immediately terminate the service agreement with that user.
(c)
For the purpose of serving users, this application may provide you with information that is of interest to you by using your personal information, including but not limited to sending you product and service information, or sharing information with this application partner so that they can send you Information about its products and services (the latter requires your prior consent).
3. Information disclosure
Under the following circumstances, this application will disclose your personal information in whole or in part according to your personal wishes or legal requirements:
(a) disclosure to third parties with your prior consent;
(b) in order to provide the products and services you have requested, your personal information must be shared with third parties;
(c) disclosure to third parties or administrative or judicial bodies in accordance with the relevant provisions of the law or the requirements of administrative or judicial bodies;
(d) if you have violated relevant Chinese laws, regulations or this application service agreement or related rules, you need to disclose it to a third party;
(e) If you are a qualified intellectual property complainant and have filed a complaint, you should disclose it to the respondent at the request of the respondent so that both parties can deal with possible disputes over rights;
(f) In a transaction created on the application platform, if any party to the transaction fulfills or partially fulfills the transaction obligations and requests for information disclosure, the application has the right to determine the necessary means to provide the user with the contact method of the counterparty Information to facilitate the completion of a transaction or the resolution of a dispute.
(g) Other disclosures that this application deems appropriate in accordance with laws, regulations or website policies.
4. Information storage and exchange
The information and data collected about you by this application will be stored on the server of this application and / or its affiliates. Such information and data may be transferred to your country, region or outside the country where the information and data are collected by this application and in Accessed, stored and displayed overseas.
5. Use of cookies
(a) If you do not refuse to accept cookies, this application will set or access cookies on your computer
So that you can log in or use the services or features of this application platform that rely on cookies. This application uses cookies to provide you with more thoughtful personalized services, including promotion services.
(b)
You have the right to choose to accept or decline cookies. You can refuse to accept cookies by modifying your browser settings. However, if you choose to decline cookies, you may not be able to log in or use the web services or features of this application that rely on cookies.
(c) The relevant information obtained through the cookies set by this application will apply this policy.
6. Information security
(a)
This application account has security protection functions, please keep your username and password information properly. This application will ensure that your information is not lost, misused and altered by security measures such as encrypting user passwords. Despite the aforementioned security measures, please also note that there are no "perfect security measures" on the information network.
(b) When using this application network service for online transactions, you must inevitably ask the counterparty or potential transaction pair
7. Changes to this privacy policy
(a) if we decide to change our privacy policy, we will post those changes in this policy, on our website, and where we deem appropriate, so that you understand how we collect and use your personal information and who can access it, And under what circumstances we will disclose this information.
(b) The company reserves the right to modify this policy at any time, so please check it frequently. If major changes are made to this policy, the company will notify through a website notification.
Party to disclose their personal information, such as contact information or postal address. Please protect your personal information and provide it to others only when necessary. If you find that your personal information has been leaked, especially the user name and password of this application, please contact the customer service of this application immediately so that this application can take corresponding measures.
</content>

@ -1,117 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<agreements>
本协议是导线助手手机应用程序(以下简称导线助手或“本应用”)与应用使用人(以下简称“用户”或“您”)所达成的协议。为使用导线助手应用的服务,您应当阅读并遵守本《用户服务协议》(以下简称“本协议”)。请您使用本应用以前,务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、管辖与法律适用条款,以及开通或使用某项服务的单独协议。限制、免责条款可能以黑体加粗或加下划线的形式提示您重点注意。
您使用本应用的服务即视为您已仔细阅读并充分了解前述协议的内容,并同意接受上述协议的约束。除非您已阅读并接受本协议所有条款,否则您无权使用本应用所提供的服务。
如果您未满18周岁,请在法定监护人的陪同下阅读本协议,并特别注意未成年人使用条款。
我们的产品会传输用户已安装应用的相关信息。在使用这些信息之前,我们会先获取用户的授权,经许 可后,才会进行下一步。我们不会将这些信息用于任何其它非法用途。
一、使用者非个人化信息
我们将通过您的IP地址来收集使用者非个人化的信息,例如您的操作系统的版本、运行环境、运营商等,以优化在您手机屏幕上显示的页面。通过收集上述信息,我们亦进行客流量统计,从而改进本应用的管理和服务。
这些无关个人身份的信息能帮助我们辨别导线助手最受欢迎的地区并确定我们推广活动的有效性。此外,我们也可能将这些信息披露给我们的客户,使他们知道点击他们广告的人数。
二、个人资料
当您在本用于进行用户注册登记、参加网上论坛等各种活动,或者在使用本应用特定服务时,本应用可能会通过注册表格等形式要求您提供一些个人资料。这些个人资料可能包括:
个人识别资料:如姓名、性别、年龄、出生日期、身份证号码(或护照号码)、电话、通信地址、住址、电子邮件地址等;
个人背景:如职业、教育程度、收入状况、家庭状况、征信记录等;
个人经历:如个人职业经历、社会履历等。
特定情形下,需要您按照本应用的要求提供所需个人资料后才能继续使用本应用的全部或部分服务,请您务必按照要求提供个人资料。否则,可能无法继续
使用本应用的全部或部分服务。在前述情形下,本应用会提前向您提醒并说明。除非适用法律法规、政府机关、司法机关或者其他第三方对本应用作出强制要
求,本应用不会对您提供的信息进行实质审核,如果您提供的信息错误或者不准确,由此产生的责任由您自行承担。
请了解,在未经您同意及确认之前,本应用不会将您为参加本应用之特定活动所提供的资料利用于经您同意的用途以外的其它目的。惟有按下列第六条规定按照政府及法律要求披露时不在此限。
三、信息安全
本应用将对您所提供的资料进行严格的管理及保护,本应用将使用相应的技术,防止您的个人资料丢失、被盗用或遭篡改。但因计算机系统和网络技术的限制,本应用可能会因受到第三方的攻击或破坏,导致用户的个人信息被恶意篡改、盗取或泄露,本应用将采取合理措施防止类似事件的发生,并将配合国家机关和第三方对类似事件进行调查或提起必要的行动(包括但不限于诉讼等)。对于非因本应用过错原因而导致的信息安全问题,您同意给予谅解并豁免本应用可能承担的任何责任。
四、用户权利
您对于自己的个人资料享有以下的权利:
随时查询及请求阅览;
随时请求补充或更正;
随时请求删除;
请求停止电脑处理及利用。
五、限制利用原则
本应用惟在符合下列条件之一,方对收集之个人资料进行必要范围以外之使用:
已取得您的书面同意;
为免除您在生命、身体或财产方面之急迫危险;
为防止他人权益之重大危害;
为增进公共利益,且无损于您的重大利益。
六、披露个人资料
当政府机关依照法定程序要求本应用披露个人资料时,本应用将根据执法单位之要求或为公共安全之目的提供个人资料。在此情况下之任何披露,本应用均得免责。
七、Cookies
Cookies是指一种技术,当使用者使用没有Cookies装置的本应用时,本应用之服务器会自动发送Cookies至您的浏览器内,并存储到您的手机硬盘内,
此Cookies便负责记录日后您访问本应用的种种活动、个人资料、浏览习惯、消费习惯甚至信用记录。
运用Cookies技术,本应用能够为您提供更加周到的服务,本应用将会运用Cookies追访您的喜好,从而向您提供感兴趣的信息资料或存储密码,以便您造访本应用时不必每次重复输入密码。
八、未成年人隐私权的保护
本应用将建立和维持合理的程序,以保护未成年人个人资料的保密性及安全性。本应用郑重声明:任何18岁以下的未成年人参加网上活动应事先
得到家长或其法定监护人(以下统称为“监护人”)的可经查证的同意。
监护人应该承担保护未成年人在网络环境下的隐私权的首要责任。
本应用收集未成年人的个人资料,仅为回复未成年人特定要求的目的,一经回复完毕即从记录中删除,而不会保留这些资料做进一步的利用。
未经监护人之同意,本应用将不会使用未成年人之个人资料,亦不会向任何第三方披露或传送可识别该未成年人的个人资料。本应用如收集监护人或未成年人的姓名或其它网络通讯资料之目的仅是为获得监护人同意,则在经过一段合理时间仍未获得同意时,将主动从记录中删除此类资料。
若经未成年人之监护人同意,本应用可对未成年人之个人资料进行收集,本应用将向监护人提供:
审视自其子女或被监护人收集之资料的机会;
拒绝其子女或被监护人的个人资料被进一步的收集或利用的机会;
变更或删除其子女或被监护人个人资料的方式。
监护人有权拒绝本应用与其子女或被监护人做进一步的联络。
本应用收集未成年人的个人资料,这些资料只是单纯作为保护未成年人参与网络活动时的安全,而非是作为其它目的来利用。本应用保证不会要求未成年人提供额外的个人资料,以作为允许其参与网上活动的条件。
九、用户违法行为
您在使用本应用服务时须遵守法律法规,不得利用本应用服务从事任何违法违规行为,包括但不限于:
(1)发布、传送、传播、储存危害国家安全统一、破坏社会稳定、违反公序良俗、侮辱、诽谤、淫秽、暴力以及任何违反国家法律法规的内容;
(2)发布、传送、传播、储存侵害他人知识产权、商业秘密等合法权利的内容;
(3)虚构事实、隐瞒真相以误导、欺骗他人;
(4)发布、传送、传播广告信息及垃圾信息;
(5)其他法律法规禁止的行为。
如果您违反本条之约定,有权国家机关可能会对您提起诉讼、罚款或采取其他制裁措施,并要求本应用给予协助或支持,由此产生的责任均应当由您自行承担。造成损害的,您应依法予以赔偿,本应用不承担任何责任。
如果在您使用本应用服务时违反本条约定,本应用有权进行独立判断并采取技术手段予以删除、屏蔽或断开链接。同时,本应用有权视您的行为性质,采取包括但不限于暂停或终止服务,限制、冻结或终止注册账号等,追究法律责任等措施。
如果您违反本条约定,导致任何第三方损害的,您应当独立承担责任;导致本应用遭受损失的,您也应当一并赔偿。
十、遵守法律和监管政策
您在使用本服务过程中应当遵守当地相关的法律法规和监管政策,并尊重当地的道德和风俗习惯。如果您的行为违反了当地法律法规或道德风俗,您应当为此独立承担责任。
您应避免因使用本服务而使本应用卷入政治和公共事件,否则本应用有权暂停或终止对您的服务。
十一、合法传播和第三方投诉处理
您通过本服务发送或传播的内容(包括但不限于网页、文字、图片、音频、视频、图表等)均由您自行承担责任。
您发送或传播的内容应有合法来源,相关内容为您所有或您已获得权利人的授权。
您同意本应用可为履行本协议或提供本服务的目的而使用您发送或传播的内容。
如果本应用收到权利人通知,主张您发送或传播的内容侵犯其相关权利的,您同意本应用有权进行独立判断并采取删除、屏蔽或断开链接等措施。
您使用本服务时不得违反国家法律法规、侵害他人合法权益。您理解并同意,如您被他人投诉侵权或您投诉他人侵权,本应用有权将争议中相关方的主体、联系方式、
投诉相关内容等必要信息提供给其他争议方或相关部门,以便及时解决投诉纠纷,保护他人合法权益。
十二、免责
除上述第六条规定属免责外,下列情况时本应用亦不需承担任何责任:
不可抗力或意外事件等风险因素,导致本应用服务发生中断。
由于您将用户密码告知他人或与他人共享注册账户,或者您操作不当而导致的任何损失;
任何由于计算机问题、黑客攻击、计算机病毒侵入或发作、因政府管制而造成的暂时性关闭等影响网络正常经营之不可抗力而造成的个人资料泄露、丢失、被盗用或被篡改等;
用户或本应用的电脑软件、系统、硬件和通信线路出现故障;
本应用的网页上有与其他网站网页的链接,包括网页上的广告。本应用对其他任何网站的内容、隐私政策或运营,或经营这些网站的公司的行为概不负责。在向这些网与本应用链接的其他网站提供个人信息以前,请查阅它们的隐私政策。
用户通过非本应用授权的方式使用本服务;
由于与本应用链接的其它网站所造成之个人资料泄露及由此而导致的任何法律争议。
由于用户使用第三方服务而导致的损失或产生的任何争议。其他本应用无法控制或合理预见的情形。
由于用户粗心、图纸错误、放样方法错误等个人原因或第三方原因导致的损失。
由于用户上传具有保密级别数据而导致的泄密行为
您理解并同意,在使用本服务的过程中,可能会遇到网络信息或其他用户行为带来的风险,本应用不对任何信息的真实性、适用性、合法性承担责任,也不对因侵权行为给您造成的损害负责。
十三、第三方服务
您在本应用平台上使用第三方提供的产品或服务时,除遵守本协议约定外,还应遵守第三方的用户协议。
您已知悉并了解,本应用平台上所链接或嵌入的第三方服务并非本应用提供,如果您对第三方服务有异议,可以直接与第三方联系,也可以向本应用反馈。本应用将协助您联系第三方并转达您的需求和意见。
您确认并同意,在您使用第三方服务时,除非适用法律有明确规定,您和第三方的纠纷应由您和第三方解决。根据适用法律的规定,本应用需要承担责任的,本应用和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。
十四、协议的生效与变更
您使用本应用的服务即视为您已阅读本协议并接受本协议的约束。
本应用有权在必要时修改本协议条款。您可以在相关服务页面查阅最新版本的协议条款。
本协议条款变更后,如果您继续使用本应用提供的软件或服务,即视为您已接受修改后的协议。如果您不接受修改后的协议,应当停止使用本应用提供的软件或服务。
十五、服务的变更、中断、终止
本应用可能会对服务内容进行变更,也可能会中断、中止或终止服务。您理解并同意,本应用有权自主决定经营策略。
在本应用发生合并、分立、收购、资产转让时,本应用可向第三方转让本服务下相关资产;本应用也可在单方通知您后,将本协议下部分或全部服务转交由第三方运营或履行。具体受让主体以本应用通知的为准。
如发生下列任何一种情形,本应用有权不经通知而中断或终止向您提供的服务:
(1)根据法律规定您应提交真实信息,而您提供的个人资料不真实、或与注册时信息不一致又未能提供合理证明;
(2)您违反相关法律法规或本协议的约定;
(3)按照法律规定或主管部门的要求;
(4)出于安全的原因或其他必要的情形。
您有责任自行备份存储在本服务中的数据。如果您的服务被终止,本应用可以从服务器上永久地删除您的数据,但法律法规另有规定的除外。服务终止后,本应用没有义务向您返还数据。
十六、管辖与法律适用
本协议的成立、生效、履行、解释及纠纷解决,适用中华人民共和国大陆地区法律(不包括冲突法)。
本协议签订地为中华人民共和国上海市静安区。
若您和本应用之间发生任何纠纷或争议,首先应友好协商解决;协商不成的,您同意将纠纷或争议提交本协议签订地(即中国郑州市)有管辖权的人民法院管辖。
本协议所有条款的标题仅为阅读方便,本身并无实际涵义,不能作为本协议涵义解释的依据。
本协议条款无论因何种原因部分无效或不可执行,其余条款仍有效,对双方具有约束力。
十七、激活许可
导线助手内部有两种激活形式,激活后可以使用部分限制功能
1.绑定手机硬件(主板)形式,软件里可以自助激活,或找客服人员索要,换手机或更换主板需要重新购买
2.按服务周期购买形式,供购买的服务周期分为月、季、半年、年,分别对应30天、90天、180天和365天。服务到期后,部分功能将无法使用,您可以选择再次购买一个服务周期。
本平台可能会对服务内容进行变更,也可能会中断、中止或终止服务。您理解并同意,本平台有权自主决定经营策略。
如果发生本平台未能在服务周期内提供应许内容的情况,您有权申请退还剩余服务周期对应的款项。
如您因发布广告等其他垃圾信息被注销账号,本平台将不对您购买的服务周期另做补偿。
如果因安卓系统等第三方更新导致导线助手无法识别手机硬件信息而导致用户无法继续使用付费项目的,导线助手有权停止服务。当用户降级系统或撤销更新,手机回到购买时状态时,导线助手应继续免费提供相应的服务。
导线助手对以上条款保有最终解释权。
</agreements>

@ -1,116 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<agreements>
This agreement is an agreement reached between the surveyor's mobile application (hereinafter referred to as surveyor or "this application") and the application user (hereinafter referred to as "user" or "you"). In order to use the services of the Surveyor Application, you should read and abide by this User Service Agreement (hereinafter referred to as "this Agreement"). Before using this application, please read carefully and fully understand the content of each clause, especially the clauses of exemption or limitation of liability, the provisions of jurisdiction and law, and the separate agreement to open or use a service. Limitations and disclaimers may be highlighted in bold or underlined.
Your use of the services of this application shall be deemed that you have carefully read and fully understood the contents of the foregoing agreement, and agree to be bound by the foregoing agreement. Unless you have read and accepted all the terms of this agreement, you are not authorized to use the services provided by this application.
If you are under the age of 18, please read this agreement with your legal guardian and pay special attention to the terms of use for minors.
Our products transmit information about apps that users have installed. Before using this information, we will obtain authorization from the user, and then proceed to the next step after permission is obtained. We will not use this information for any other illegal purpose.
I. User non-personalized information
We will collect non-personalized information of users through your IP address, such as your operating system version, operating environment, operator, etc., to optimize the pages displayed on your mobile phone screen. By collecting the above information, we also perform passenger traffic statistics to improve the management and service of this application.
This non-personally identifiable information helps us identify the most popular areas for surveyors and determine the effectiveness of our promotional activities. In addition, we may disclose this information to our customers so that they know how many people click on their ads.
Personal data
When you are using this application for user registration, participating in online forums and other activities, or when using specific services of this application, this application may ask you to provide some personal information through registration forms and other forms. These personal data may include:
Personal identification information: such as name, gender, age, date of birth, ID number (or passport number), telephone, mailing address, residential address, email address, etc .;
Personal background: such as occupation, education, income status, family status, credit history, etc .;
Personal experience: such as personal professional experience, social resume, etc.
In certain situations, you need to provide the required personal information in accordance with the requirements of this application before you can continue to use all or part of the services of this application. Please be sure to provide personal information in accordance with the requirements. Otherwise, you may not be able to continue
Use all or part of the services of this application. In the aforementioned situation, this app will remind and explain to you in advance. Unless applicable laws and regulations, government agencies, judicial authorities, or other third parties mandate this application
Request, this application will not conduct a substantive review of the information you provide. If the information you provide is wrong or inaccurate, you will be responsible for the resulting responsibility.
Please understand that without your consent and confirmation, this app will not use the data you provide for participating in specific activities of this app for purposes other than those for which you have agreed. Except when the disclosure is required by the government and the law in accordance with Article 6 below.
Information security
This application will strictly manage and protect the information you provide. This application will use corresponding technology to prevent your personal data from being lost, stolen or tampered with. However, due to the limitations of computer systems and network technologies, this application may be attacked or damaged by third parties, resulting in the user's personal information being maliciously tampered with, stolen or leaked. This application will take reasonable measures to prevent similar incidents, and Will cooperate with national authorities and third parties to investigate similar matters or initiate necessary actions (including but not limited to litigation, etc.). For information security issues that are not caused by the fault of this application, you agree to understand and waive any responsibility that this application may assume.
User rights
You have the following rights regarding your personal data:
Enquiries and requests for viewing at any time;
Request supplements or corrections at any time;
Request deletion at any time;
Request to stop computer processing and use.
V. Restricted Use Principle
This application can only use the collected personal data beyond the necessary scope if it meets one of the following conditions:
Has obtained your written consent;
To relieve you of imminent danger in life, body or property;
To prevent major harm to the rights and interests of others;
To promote the public interest without prejudice to your major interests.
6. Disclosure of Personal Information
When government agencies require this application to disclose personal data in accordance with legal procedures, this application will provide personal data at the request of law enforcement agencies or for public safety purposes. Any disclosure in this case shall be exempt from this application.
7. Cookies
Cookies refer to a technology. When a user uses this application without a cookie device, the server of this application will automatically send cookies to your browser and store them on your mobile hard disk.
These cookies are responsible for recording your various activities, personal data, browsing habits, spending habits and even credit history of your future access to this application.
Using cookies technology, this application can provide you with more thoughtful services. This application will use cookies to follow your preferences, so as to provide you with interesting information or storage passwords so that you do not have to repeat each time you visit this application enter password.
Protection of the privacy of minors
This application will establish and maintain reasonable procedures to protect the confidentiality and security of minors' personal data. This application solemnly declares that any minor under 18 years of age should participate in online activities in advance
Obtain the verifiable consent of the parent or his legal guardian (collectively referred to as the "guardian").
The guardian should bear the primary responsibility for protecting the privacy of minors in the online environment.
This application collects the personal data of minors for the purpose of responding to the specific requirements of the minors. Once the response is completed, it will be deleted from the records without retaining these data for further use.
Without the consent of the guardian, this application will not use the personal data of the minor, nor will it disclose or transmit to any third party personal data that can identify the minor. If this application collects the name of a guardian or a minor or other online communication materials for the sole purpose of obtaining the consent of the guardian, if no consent has been obtained after a reasonable period of time, such information will be actively deleted from the record.
With the consent of the guardian of the minor, this app can collect the personal data of the minor, and this app will provide the guardian with:
Opportunities to review information collected from their children or guardians;
Opportunities to deny the further collection or use of the personal data of their children or guardians;
How to change or delete personal information of their children or guardians.
The guardian has the right to refuse this application to make further contact with its children or ward.
This application collects personal data of minors. These data are only used to protect the safety of minors when they participate in online activities, and not for other purposes. This app guarantees that minors will not be required to provide additional personal information as a condition to allow them to participate in online activities.
Nine, user illegal behavior
You must abide by laws and regulations when using this application service, and you must not use this application service to engage in any illegal acts, including but not limited to:
(1) Publishing, transmitting, disseminating, and storing contents that endanger national security and unity, undermine social stability, violate public order and good customs, insult, defamation, obscenity, violence, and any content that violates national laws and regulations;
(2) Publishing, transmitting, disseminating, and storing content that infringes on the intellectual property rights, trade secrets, and other legal rights of others;
(3) Fictional facts, concealing the truth to mislead and deceive others;
(4) Publishing, transmitting, and disseminating advertising information and spam;
(5) Other acts prohibited by laws and regulations.
If you violate the provisions of this article, the competent state authority may file a lawsuit, fine or take other sanctions against you, and ask for assistance or support for this application, and the resulting responsibility should be borne by you. If it causes damage, you should compensate it according to law, and this application will not bear any responsibility.
If you violate this agreement when you use this application service, this application has the right to make independent judgment and take technical measures to delete, block or disconnect the link. At the same time, depending on the nature of your behavior, this application has the right to take measures including, but not limited to, suspending or terminating services, restricting, freezing, or terminating registered accounts, etc., and pursue legal responsibilities.
If you violate this agreement and cause damage to any third party, you shall be solely responsible; if you cause losses to this application, you shall also pay compensation.
X. Compliance with laws and regulatory policies
In using this service, you should abide by relevant local laws and regulations and regulatory policies, and respect local morals and customs. If your actions violate local laws and regulations or ethics, you are solely responsible for this.
You should avoid getting the app involved in political and public events as a result of using the service, otherwise the app has the right to suspend or terminate the service to you.
Eleven, legal dissemination and handling of third-party complaints
The content (including but not limited to web pages, text, pictures, audio, video, graphics, etc.) that you send or disseminate through this service is your responsibility.
The content you send or disseminate should be from a legitimate source, the content is owned by you or you have been authorized by the right holder.
You agree that this application may use the content you send or distribute for the purpose of fulfilling this agreement or providing this service.
If the app receives notification from the right holder that the content you sent or transmitted violates its related rights, you agree that the app has the right to make independent judgments and take measures such as removing, blocking or disconnecting the link.
When using this service, you must not violate national laws and regulations and infringe on the legal rights and interests of others. You understand and agree that if you are complained of infringement by others or you have complained of infringement by others, this app has the right to change the subject, contact information,
The necessary information such as the content of the complaint is provided to other dispute parties or relevant departments in order to resolve the complaint dispute in a timely manner and protect the legitimate rights and interests of others.
12. Disclaimer
In addition to the exemption provided in Article 6 above, this application does not need to bear any responsibility in the following situations:
Risk factors such as force majeure or accidents cause the application service to be interrupted.
Any loss caused by you telling your user password to others or sharing a registered account with others, or your improper operation;
Any personal data leakage, loss, theft or tampering caused by computer force, force majeure that affects the normal operation of the network due to computer problems, hacking attacks, computer virus intrusion or outbreak, temporary shutdown due to government control, etc.
The user or the application's computer software, system, hardware, and communication lines have failed;
The web pages of this application have links to the web pages of other websites, including advertisements on the web pages. This application is not responsible for the content, privacy policies, or operations of any other website, or the behavior of the company that operates those websites. Please review their privacy policies before providing personal information to these websites and other websites linked to this application.
Users use the service in ways not authorized by this application;
Personal data leakage caused by other websites linked to this application and any legal disputes arising therefrom.
Loss or any dispute arising from the use of third party services by the user. Other situations beyond the control of this application or reasonably foreseeable.
Loss due to personal care or user's carelessness, wrong drawing, wrong stakeout method, etc.
Leaks due to users uploading confidential data
You understand and agree that in the process of using this service, you may encounter risks brought by network information or other user behaviors. This application is not responsible for the authenticity, applicability, legality of any information, and is not responsible for infringement Liability for damage caused to you.
Thirteenth party services
When you use products or services provided by third parties on this application platform, in addition to complying with this agreement, you should also comply with the third party's user agreement.
You know and understand that the third-party services linked or embedded on this application platform are not provided by this application. If you have any objection to the third-party services, you can directly contact the third party or provide feedback to this application. This application will assist you in contacting third parties and communicating your needs and opinions.
You acknowledge and agree that when you use third-party services, unless you are clearly required by applicable law, your dispute with the third party shall be resolved by you and the third party. According to the provisions of applicable laws, if this application needs to bear responsibility, this application and the third party shall bear their own responsibility for possible disputes within the scope stipulated by law and agreement.
14. Effectiveness and changes of the agreement
Your use of the services of this application is deemed that you have read this agreement and are bound by this agreement.
This application reserves the right to modify the terms of this agreement if necessary. You can find the latest version of the agreement terms on the relevant service page.
After changing the terms of this agreement, if you continue to use the software or services provided by this application, you are deemed to have accepted the modified agreement. If you do not accept the modified agreement, you should stop using the software or services provided by this application.
15. Change, Interruption and Termination of Services
This application may change the content of the service, and may also interrupt, suspend or terminate the service. You understand and agree that this application has the right to determine its own business strategy.
When the application merges, splits, acquires, or transfers assets, the application can transfer the relevant assets under the service to a third party; the application can also transfer some or all of the services under this agreement to a third party for operation after the unilateral notification Or fulfill. The specific transferee is subject to the notification in this application.
This app reserves the right to interrupt or terminate the services provided to you without notice if any of the following situations occur:
(1) According to the law, you should submit true information, and the personal information you provided is not true, or is inconsistent with the information at the time of registration, and fails to provide reasonable proof;
(2) you violate the relevant laws and regulations or the agreement of this agreement;
(3) In accordance with legal regulations or requirements of competent authorities;
(4) For security reasons or other necessary situations.
You are responsible for backing up the data stored in the Service yourself. If your service is terminated, this application may permanently delete your data from the server, unless otherwise provided by laws and regulations. After the service is terminated, the app is not obliged to return data to you.
16.Jurisdiction and application of law
The establishment, entry into force, performance, interpretation and dispute resolution of this agreement shall be governed by the laws of the People's Republic of China (excluding conflict of laws).
This agreement was signed in Zhengzhou, People's Republic of China.
If there is any dispute or dispute between you and this application, it should be settled through friendly negotiation first; if the negotiation fails, you agree to submit the dispute or dispute to the jurisdiction of the people's court in the place where this agreement is signed (ie Zhengzhou, China).
The headings of all the terms of this agreement are for convenience only. They have no actual meaning and cannot be used as a basis for interpreting the meaning of this agreement.
No matter what the terms of this agreement are partially invalid or unenforceable, the remaining terms are still valid and binding on both parties.
Seventeen, pay
Charge for some functions in surveyor
Binding mobile phone hardware (motherboard), and automatically generate an activation code after payment, or ask for customer service personnel, you need to pay for a new phone or motherboard
This platform may change the content of the service, and may also interrupt, suspend or terminate the service. You understand and agree that the platform has the right to independently determine its business strategy.
In the event that the platform fails to provide the promised content during the service period, you have the right to apply for a refund of the amount corresponding to the remaining service period.
If your account is cancelled due to other spam information such as advertising, this platform will not make additional compensation for the service cycle you purchased.
If a third-party update such as the Android system prevents the surveyor from recognizing the hardware information of the phone and the user cannot continue to use the paid item, the surveyor has the right to stop the service. When the user downgrades the system or cancels the update, and the phone returns to the state it was in, the surveyor should continue to provide corresponding services for free.
Surveyors reserve the right of final interpretation.
</agreements>

@ -200,6 +200,7 @@ public class App extends RepositoryBaseApp {
}
private void initControlApp() {
userAgreementAgree = true;
ISurveyorConstants.isOpenAtr = SettingValueUtil.isOpenAtr();
Utils.init(this);
ThreadPoolUtil.execute(ToleranceLoadUtil::init);

@ -60,9 +60,9 @@ public class AboutActivity extends ColorfulActivity {
private View getTianjinView() {
View viewTianjin = View.inflate(this, R.layout.item_about_tj_one, null);
TextView tvUnit = viewTianjin.findViewById(R.id.tvUnit);
// TextView tvUnit = viewTianjin.findViewById(R.id.tvUnit);
TextView tvVersion = viewTianjin.findViewById(R.id.tvVersion);
tvVersion.setText("版本:" + Tools.getVersionName());
tvVersion.setText(Tools.getVersionName());
return viewTianjin;
}

@ -40,16 +40,13 @@ import com.bingce.controlapphelper.util.SettingValueUtil;
import com.bingce.controlnetwork.App;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.activity.backup.launch.BackupImportHelper;
import com.bingce.controlnetwork.activity.user.LoginActivity;
import com.bingce.controlnetwork.activity.user.RegisterActivity;
import com.bingce.controlnetwork.activity.user.UserInfoActivity;
import com.bingce.controlnetwork.fragment.MainSurveyFragment;
import com.bingce.controlnetwork.fragment.ProjectListFragment;
import com.bingce.controlnetwork.newui.configfragment.ConfigFragment;
import com.bingce.controlnetwork.newui.mefragment.MeFragment;
import com.bingce.controlnetwork.viewmodel.MainActivityViewModel;
import com.bingce.data.sync.GlobalFlowCenter;
import com.bingce.data.sync.utils.LeanCloudConfigLoader;
import com.bingce.device.Device;
import com.bingce.device.ui.manager.DeviceConnectManager;
import com.bingce.device.ui.manager.DeviceRemindManager;
@ -62,7 +59,6 @@ import com.bingce.ui.TabEntity;
import com.bingce.utils.ColorUtil;
import com.bingce.utils.DateUtils;
import com.bingce.utils.SdkUtils;
import com.bingce.utils.ServiceDateUtils;
import com.bingce.utils.SoundPoolUtil;
import com.bingce.utils.VipManager;
import com.daimajia.numberprogressbar.NumberProgressBar;
@ -80,7 +76,6 @@ import net.tatans.tensorflowtts.tts.TtsManager;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.jetbrains.annotations.NotNull;
import org.polaric.colorful.Colorful;
import java.util.ArrayList;
@ -91,7 +86,6 @@ import blankj.utilcode.util.ActivityUtils;
import blankj.utilcode.util.ServiceUtils;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
import cn.leancloud.LCException;
import cn.leancloud.LCObject;
import cn.leancloud.LCQuery;
import cn.leancloud.LCUser;
@ -139,19 +133,20 @@ public class MainActivity extends BaseMainActivity implements Device.IDeviceConn
IntentFilter filter = new IntentFilter();
filter.addAction(MAIN_IN_ACTION_NAME);
if (LCUser.getCurrentUser() != null && LCUser.getCurrentUser().isAuthenticated()) {
VipManager.getInstance().controlSdkRefresh(this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
// if (LCUser.getCurrentUser() != null && LCUser.getCurrentUser().isAuthenticated()) {
//
// }
VipManager.getInstance().controlSdkRefresh(this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
}
}
@Override
public void onRefreshFailed(int errorCode) {
@Override
public void onRefreshFailed(int errorCode) {
}
});
}
}
});
}
/**
@ -512,111 +507,6 @@ public class MainActivity extends BaseMainActivity implements Device.IDeviceConn
}
}
public void showTryVipDialog() {
if (TotalStation.getInstance().isSupportMotor() && !VipManager.getInstance().checkReg()) {
LeanCloudConfigLoader.findInBackground("android_control_network_pro_try_switch", instance -> {
if (instance != null && "true".equals(instance.value)) {
if (LCUser.getCurrentUser() != null) {
ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() {
@Override
public void get(Date serverDate) {
if (VipManager.getInstance().controlLevel == 0) {
new MaterialDialog.Builder(ActivityUtils.getTopActivity())
.title(R.string.congratulations)
.content("你获得了3天的专业版试用机会,可以驱动马达进行自动观测")
.positiveText("马上试用")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) {
Date newExpireDate = DateUtils.addDayOfMonth(serverDate, 3, false, true);//多1天是为了显示
LCUser.getCurrentUser().put("controlLevel", 1);
LCUser.getCurrentUser().put("controlExpireDate", newExpireDate);
LCUser.getCurrentUser().saveInBackground().subscribe(new Observer<LCObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(LCObject avObject) {
VipManager.getInstance().controlSdkRefresh(MainActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
new MaterialDialog.Builder(ActivityUtils.getTopActivity())
.title(R.string.success)
.content("开通成功,当前到期时间为" + DateUtils.toFull(newExpireDate))
.positiveText(R.string.confirm)
.show();
}
@Override
public void onRefreshFailed(int errorCode) {
}
});
}
@Override
public void onError(Throwable e) {
ToastUtils.showShort("开通失败,错误码:" + new LCException(e).getCode());
}
@Override
public void onComplete() {
}
});
}
})
.negativeText("取消")
.show();
} else if (VipManager.getInstance().controlLevel == 1) {
if (!VipManager.getInstance().isControlInExpireDate)
new MaterialDialog.Builder(ActivityUtils.getTopActivity())
.title(R.string.congratulations)
.content("你获得了7天的专业版试用机会,可以驱动马达自动观测,请联系客服申请开通")
.positiveText("马上申请")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) {
Intent intent = new Intent();
intent.setClass(Utils.getApp(), AgentWebActivity.class);
intent.putExtra("short_url", "android_url_business_manager");
startActivity(intent);
}
})
.negativeText("取消")
.show();
}
}
@Override
public void error(Throwable throwable) {
ToastUtils.showShort(R.string.get_server_date_failed);
}
});
} else {
new MaterialDialog.Builder(ActivityUtils.getTopActivity())
.title(R.string.log_in_to_try)
.content("登录后,您将获取3-7天的试用机会,请登录")
.positiveText("登录")
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) {
Intent intent = new Intent();
intent.setClass(Utils.getApp(), LoginActivity.class);
intent.putExtra("finishTo", UserInfoActivity.class.getName());
startActivity(intent);
}
})
.negativeText("取消")
.show();
}
}
});
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(CountDownEvent event) {
if (cutDownProgressBar != null) {

@ -9,6 +9,7 @@ import android.util.Log;
import androidx.annotation.Nullable;
import com.bingce.controlnetwork.databinding.ActivitySplashBinding;
import com.bingce.file.FileOperator;
import com.bingce.path.PathManager;
import com.bingce.utils.NetworkUtil;
@ -30,14 +31,14 @@ import cn.leancloud.LCFile;
import cn.leancloud.LCObject;
import cn.leancloud.LCQuery;
import com.bingce.controlnetwork.databinding.ActivitySplashBinding;
/**
* 欢迎页
*/
@SuppressLint("CustomSplashScreen")
public class SplashActivity extends ColorfulActivity {
private boolean isEnterMainActivity = false;
private static final String CODE_NO_UPLOAD = "0";
private static final String CODE_UPLOAD_COMPARE_SMALL_WITH_FIRST = "1";
private static final String CODE_UPLOAD_COMPARE_SMALL_WITHOUT_FIRST = "2";
@ -65,7 +66,7 @@ public class SplashActivity extends ColorfulActivity {
if (collectFileList != null && !collectFileList.isEmpty()) {
SimpleDateFormat simple = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
String fileName = "导线助手数据备份_" + "_" + getVersionName() + "_" + simple.format(new Date());
String fileName = "控制测量电子手薄数据备份_" + "_" + getVersionName() + "_" + simple.format(new Date());
File zipTartFile = new File(copyFolder, fileName + ".zip");
boolean zip = ZipUtil.zip(zipTartFile, collectFileList);
@ -135,7 +136,7 @@ public class SplashActivity extends ColorfulActivity {
}
/**
* 导线助手是否自动上传可能错误的数据库
* 控制测量电子手薄是否自动上传可能错误的数据库
* 0.不上传
* 1.比上次小就上传上次备份数据但是如果是首次备份也将该备份上传
* 2.比上次小就上传上次备份数据如果是首次备份不会将该备份上传
@ -196,8 +197,11 @@ public class SplashActivity extends ColorfulActivity {
}
private void goMainActivity() {
startActivity(new Intent(this, MainActivity.class));
finish();
if (!isEnterMainActivity) {
isEnterMainActivity = true;
startActivity(new Intent(this, MainActivity.class));
finish();
}
}

@ -5,6 +5,7 @@ import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
@ -12,6 +13,7 @@ import android.widget.Button;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.appcompat.widget.Toolbar;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.controlapphelper.datasource.database.SurveyorDataBase;
@ -42,7 +44,7 @@ import blankj.utilcode.util.ToastUtils;
public abstract class AbstractBackupExportActivity extends ColorfulActivity implements AsynchronousHelper.IDelegate {
public static final String BACKUP_NAME = "导线助手数据";
public static final String BACKUP_NAME = "控制测量电子手薄数据";
public static final String FOLDER_DADA_DATABASES = "dada_databases";
public static final String FOLDER_DATA_FILE_PROJECT = "data_file_project";
public static final String FOLDER_ANDROID = "android";
@ -61,12 +63,26 @@ public abstract class AbstractBackupExportActivity extends ColorfulActivity impl
final protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityExportLayoutBinding.inflate(getLayoutInflater());
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
setContentView(binding.getRoot());
Toolbar mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
binding.shareButton.setOnClickListener(v -> doCollect());
binding.progressText.setText(tipsString());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
protected abstract String applicationId();
protected abstract String zipFileName(String dateString, String projectName);
@ -116,7 +132,7 @@ public abstract class AbstractBackupExportActivity extends ColorfulActivity impl
File[] files3 = file3.listFiles();
List<File> androidFiles = getDbListFiles(files3);
//4
File file4 = new File(FileUtil.getSDPath(), "导线助手");
File file4 = new File(FileUtil.getSDPath(), "控制测量电子手薄");
File[] files4 = file4.listFiles();
List<File> sdFiles = getDbListFiles(files4);

@ -4,19 +4,20 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.Toolbar;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.databinding.ActivityMigration2PrivateFolderLayoutBinding;
import com.bingce.file.DownloadFilePicker;
import com.bingce.utils.AsynchronousHelper;
import com.bingce.utils.IntentUtil;
import org.polaric.colorful.ColorfulActivity;
import com.bingce.controlnetwork.databinding.ActivityMigration2PrivateFolderLayoutBinding;
public class MigrationFolder2PrivateRoomActivity extends ColorfulActivity implements AsynchronousHelper.IDelegate {
private final DownloadFilePicker downloadFilePicker = new DownloadFilePicker(this);
private final AsynchronousHelper migrationHelper = new AsynchronousHelper(this);
@ -25,15 +26,21 @@ public class MigrationFolder2PrivateRoomActivity extends ColorfulActivity implem
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
binding = ActivityMigration2PrivateFolderLayoutBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
Toolbar mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//从备份文件导入
binding.backupFromZip.setOnClickListener(v -> {
binding.layout2.setVisibility(View.INVISIBLE);
ZipMigrationUtils.importFromZip(MigrationFolder2PrivateRoomActivity.this,
"导线助手数据+日期",
"控制测量电子手薄数据+日期",
migrationHelper,
downloadFilePicker,
new ZipMigrationUtils.IMigrationListener() {
@ -60,6 +67,15 @@ public class MigrationFolder2PrivateRoomActivity extends ColorfulActivity implem
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
finish();
}
return super.onOptionsItemSelected(item);
}
private void showWorkLayout() {
binding.workLayout.setVisibility(View.VISIBLE);
binding.back.setEnabled(false);
@ -121,4 +137,5 @@ public class MigrationFolder2PrivateRoomActivity extends ColorfulActivity implem
intent.putExtra(KEY_FROM_MAIN_ACTIVITY, fromMainActivity);
return intent;
}
}

@ -28,6 +28,7 @@ import com.afollestad.materialdialogs.MaterialDialog;
import com.bingce.controlapphelper.util.SettingValueUtil;
import com.bingce.controlnetwork.App;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.util.CheckRegUtil;
import com.bingce.data.sync.utils.LeanCloudConfigLoader;
import com.bingce.device.enums.SpecialDeviceEnum;
import com.bingce.device.ui.dialog.DialogUtil;
@ -88,7 +89,7 @@ public class RegisterActivity extends ColorfulActivity {
mTextViewVersion.setText("V" + AppUtils.getAppVersionName());
if (!AppUtil.isZh() && SdkUtils.isRegCodeValidate() && !SdkUtils.isIntlCodeValidate()) {//非中文环境需要国际许可码
if (!AppUtil.isZhCN() && SdkUtils.isRegCodeValidate() && !SdkUtils.isIntlCodeValidate()) {//非中文环境需要国际许可码
DialogUtil.mDismissAlertDialog(this, R.string.hint, R.string.you_need_apply_for_an_international_license_code, R.string.i_know, null, null);
}
@ -105,61 +106,61 @@ public class RegisterActivity extends ColorfulActivity {
break;
}
}
if (!isSpecial && Build.VERSION.SDK_INT >= 29) {
mBtnTaobaoLink.setVisibility(View.GONE);
new AlertDialog.Builder(this)
.setMessage("由于安卓10及以上系统限制App读取硬件信息,原来绑定手机激活的方式已经不可用,如果您之前绑定手机激活过,很遗憾,现在只能刷机降级到安卓9或安卓8重新输入激活才可以。如果您不想刷机,可以购买会员继续使用")
.setPositiveButton(R.string.user_vip_activate, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (LCUser.getCurrentUser() == null) {
Intent intent = new Intent(Utils.getApp(), LoginActivity.class);
intent.putExtra("finishTo", UserInfoActivity.class.getName());
startActivity(intent);
} else {
startActivity(new Intent(RegisterActivity.this, UserInfoActivity.class));
}
}
})
.setNeutralButton(R.string.opening_vip_tutorial, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Intent intent = new Intent();
// intent.setClass(Utils.getApp(), AgentWebActivity.class);
// intent.putExtra("short_url", "android_url_opening_renewal_tutorial");
// startActivity(intent);
AgentWebActivity.navigation2(RegisterActivity.this,
"android_url_opening_renewal_tutorial");
}
})
.setNegativeButton(R.string.cancel, null)
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (!hasAndroidPermission)
finish();
}
}).show();
} else {
int checkStoragePermission = ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.READ_PHONE_STATE);
if (checkStoragePermission != PackageManager.PERMISSION_GRANTED) {
requestPhoneStatePermission(this);
} else {
if ("".equals(RegisterUtil.getOriginalMachineCode()) || "SERIALNUMBERunknown".equals(RegisterUtil.getOriginalMachineCode()) || "SERIALNUMBERnull".equals(RegisterUtil.getOriginalMachineCode())) {
new MaterialDialog.Builder(this)
.title(R.string.hint)
.content("此手机机器码未知,请关闭相关限制软件请重启软件")
.positiveText(R.string.i_know)
.dismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
finish();
}
}).show();
}
}
}
if (VipManager.getInstance().checkReg()) {
// if (!isSpecial && Build.VERSION.SDK_INT >= 29) {
// mBtnTaobaoLink.setVisibility(View.GONE);
// new AlertDialog.Builder(this)
// .setMessage("由于安卓10及以上系统限制App读取硬件信息,原来绑定手机激活的方式已经不可用,如果您之前绑定手机激活过,很遗憾,现在只能刷机降级到安卓9或安卓8重新输入激活才可以。如果您不想刷机,可以购买会员继续使用")
// .setPositiveButton(R.string.user_vip_activate, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
// if (LCUser.getCurrentUser() == null) {
// Intent intent = new Intent(Utils.getApp(), LoginActivity.class);
// intent.putExtra("finishTo", UserInfoActivity.class.getName());
// startActivity(intent);
// } else {
// startActivity(new Intent(RegisterActivity.this, UserInfoActivity.class));
// }
// }
// })
// .setNeutralButton(R.string.opening_vip_tutorial, new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface dialog, int which) {
//// Intent intent = new Intent();
//// intent.setClass(Utils.getApp(), AgentWebActivity.class);
//// intent.putExtra("short_url", "android_url_opening_renewal_tutorial");
//// startActivity(intent);
// AgentWebActivity.navigation2(RegisterActivity.this,
// "android_url_opening_renewal_tutorial");
// }
// })
// .setNegativeButton(R.string.cancel, null)
// .setOnDismissListener(new DialogInterface.OnDismissListener() {
// @Override
// public void onDismiss(DialogInterface dialog) {
// if (!hasAndroidPermission)
// finish();
// }
// }).show();
// } else {
// int checkStoragePermission = ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.READ_PHONE_STATE);
// if (checkStoragePermission != PackageManager.PERMISSION_GRANTED) {
// requestPhoneStatePermission(this);
// } else {
// if ("".equals(RegisterUtil.getOriginalMachineCode()) || "SERIALNUMBERunknown".equals(RegisterUtil.getOriginalMachineCode()) || "SERIALNUMBERnull".equals(RegisterUtil.getOriginalMachineCode())) {
// new MaterialDialog.Builder(this)
// .title(R.string.hint)
// .content("此手机机器码未知,请关闭相关限制软件请重启软件")
// .positiveText(R.string.i_know)
// .dismissListener(new DialogInterface.OnDismissListener() {
// @Override
// public void onDismiss(DialogInterface dialog) {
// finish();
// }
// }).show();
// }
// }
// }
if (CheckRegUtil.checkReg(((App) Utils.getApp()).registerCodeV2)) {
getSupportActionBar().setTitle(R.string.activated);
met_activate_code.setText(((App) Utils.getApp()).registerCodeV2);
mBtnActivate.setEnabled(false);
@ -232,105 +233,10 @@ public class RegisterActivity extends ColorfulActivity {
ToastUtils.showShort(R.string.register_code_is_16_characters);
return;
}
progressDialog = new ProgressDialog(RegisterActivity.this);
progressDialog.setMessage(getString(R.string.please_wait));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
new LCQuery<>("DeviceBlacklist")
.whereEqualTo("machineCode", mOriginalMachineCode)
.limit(1)
.findInBackground().subscribe(new Observer<List<LCObject>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<LCObject> avObjects) {
if (isFinishing()) return;
if (avObjects == null || avObjects.isEmpty()) {
new LCQuery<>("Device")
.whereEqualTo("machineCode", mOriginalMachineCode)
.whereEqualTo("controlRegCode", registerCode)
.limit(1)
.findInBackground().subscribe(new Observer<List<LCObject>>() {
@Override
public void onSubscribe(Disposable disposable) {
}
@Override
public void onNext(List<LCObject> lcObjects) {
if (isFinishing()) return;
if (!lcObjects.isEmpty()) {
if (lcObjects.get(0).getBoolean("activated") && !lcObjects.get(0).getBoolean("converted")) {
((App) Utils.getApp()).registerCodeV2 = registerCode;
Util.putPreference("registerCodeV2", registerCode);
VipManager.getInstance().controlSdkRefresh(RegisterActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
progressDialog.dismiss();
getSupportActionBar().setTitle(R.string.activated);
mBtnActivate.setEnabled(false);
met_activate_code.setEnabled(false);
ToastUtils.showShort(R.string.activate_success);
}
@Override
public void onRefreshFailed(int errorCode) {
progressDialog.dismiss();
ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode);
}
});
//激活次数+1
lcObjects.get(0).increment("activationTimes");
lcObjects.get(0).saveInBackground().subscribe();
} else if (lcObjects.get(0).getBoolean("converted")) {
progressDialog.dismiss();
ToastUtils.showShort("此设备已经兑换过年会员,无法再绑定手机");
} else if (!lcObjects.get(0).getBoolean("activated")) {
progressDialog.dismiss();
ToastUtils.showShort("无法激活,请联系开发人员");
} else {
progressDialog.dismiss();
ToastUtils.showShort(R.string.cloud_has_not_register_code);
}
} else {
progressDialog.dismiss();
ToastUtils.showShort("激活码无效");
}
}
@Override
public void onError(Throwable throwable) {
progressDialog.dismiss();
ToastUtils.showShort(getString(R.string.error_code) + ":" + new LCException(throwable).getCode());
}
@Override
public void onComplete() {
}
});
} else {
progressDialog.dismiss();
ToastUtils.showShort(R.string.you_are_in_blacklist);
}
}
@Override
public void onError(Throwable e) {
progressDialog.dismiss();
ToastUtils.showShort(getString(R.string.activate_need_to_connect_to_the_internet) + "," + getString(R.string.error_code) + ":" + new LCException(e).getCode());
}
@Override
public void onComplete() {
}
});
if (CheckRegUtil.checkReg(registerCode)){
((App) Utils.getApp()).registerCodeV2 = registerCode;
Util.putPreference("registerCodeV2", registerCode);
}
}
});
mBtnTaobaoLink.setOnClickListener(new OnClickListener() {

@ -1,781 +0,0 @@
package com.bingce.controlnetwork.activity.user;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.internal.MDButton;
import com.bingce.AppChannel;
import com.bingce.controlapphelper.util.SettingValueUtil;
import com.bingce.controlnetwork.App;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.databinding.DialogEditNicknameBinding;
import com.bingce.controlnetwork.ui.WechatImagePicker;
import com.bingce.utils.DateUtils;
import com.bingce.utils.FileUtil;
import com.bingce.utils.LCDeviceUtil;
import com.bingce.utils.ServiceDateUtils;
import com.bingce.utils.ValidateUtil;
import com.bingce.utils.VipManager;
import com.bumptech.glide.Glide;
import com.leon.lib.settingview.LSettingItem;
import com.qingmei2.rximagepicker.core.RxImagePicker;
import com.qingmei2.rximagepicker.entity.Result;
import com.qingmei2.rximagepicker_extension.MimeType;
import com.qingmei2.rximagepicker_extension_wechat.WechatConfigrationBuilder;
import com.qingmei2.rximagepicker_extension_wechat.ui.WechatImagePickerFragment;
import com.yalantis.ucrop.UCrop;
import org.jetbrains.annotations.NotNull;
import org.polaric.colorful.ColorfulActivity;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import blankj.utilcode.util.StringUtils;
import blankj.utilcode.util.ToastUtils;
import blankj.utilcode.util.Utils;
import cn.leancloud.LCFile;
import cn.leancloud.LCObject;
import cn.leancloud.LCQuery;
import cn.leancloud.LCUser;
import de.hdodenhof.circleimageview.CircleImageView;
import id.zelory.compressor.Compressor;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
public class UserInfoActivity extends ColorfulActivity {
private static final String TAG = "UserInfoActivity";
private static final int REQUEST_CODE_ASK_CAMERA = 166;
private static final int REQUEST_CODE_UPDATE_USER_INFO = 11;
private Toolbar mToolbar;
private CircleImageView avatarImageView;
private TextView tv_nick_name;
private ImageView tv_nick_name_edit;
private MDButton mPositiveAction;
private LSettingItem item_phone, item_email, item_user_level, item_expiration, item_bound_device, item_control_level, item_control_expiration;
private WechatImagePicker rxImagePicker;
private Button btn_log_out, btn_opening_renewal;
private ProgressDialog progressDialog;
private boolean buy = false;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_info);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
if (getSupportActionBar() != null)
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
buy = getIntent().getBooleanExtra("buy", false);
rxImagePicker = RxImagePicker.create(WechatImagePicker.class);
avatarImageView = findViewById(R.id.activity_user_info_avatar_image);
tv_nick_name = findViewById(R.id.activity_user_info_nick_name);
tv_nick_name_edit = findViewById(R.id.activity_user_info_nick_name_edit);
item_phone = findViewById(R.id.activity_user_info_item_phone);
item_email = findViewById(R.id.activity_user_info_item_email);
item_user_level = findViewById(R.id.activity_user_info_item_user_level);
item_expiration = findViewById(R.id.activity_user_info_item_expiration_date);
item_bound_device = findViewById(R.id.activity_user_info_item_bound_device);
item_control_level = findViewById(R.id.activity_user_info_item_control_level);
item_control_expiration = findViewById(R.id.activity_user_info_item_control_expiration_date);
btn_opening_renewal = findViewById(R.id.activity_user_info_btn_opening_renewal);
btn_log_out = findViewById(R.id.activity_user_info_btn_log_out);
updateUserInfo();
avatarImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showProfileAvatarChangeDialog();
}
});
tv_nick_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showEditNicknameDialog();
}
});
tv_nick_name_edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showEditNicknameDialog();
}
});
item_phone.setOnSettingItemClick(new LSettingItem.onSettingItemClick() {
@Override
public void click(boolean isChecked) {
if (!LCUser.getCurrentUser().isMobilePhoneVerified()) {
// Intent intent = new Intent(Utils.getApp(), MobilePhoneVerifyActivity.class);
// startActivity(intent);
}
}
});
btn_log_out.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LCUser.logOut();
ToastUtils.showShort(R.string.log_out);
VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, null);
((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult
finish();
}
});
btn_opening_renewal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) {
new AlertDialog.Builder(UserInfoActivity.this)
.setTitle(R.string.hint)
.setMessage("定制版本无法续费,只能以绑定手机形式使用")
.setPositiveButton(R.string.i_know, null)
.show();
} else if (LCUser.getCurrentUser().getInt("level") == 0 || LCUser.getCurrentUser().getInt("level") == 1) {
startActivityForResult(new Intent(UserInfoActivity.this, OpeningRenewalVipActivity.class), REQUEST_CODE_UPDATE_USER_INFO);
} else {
ToastUtils.showShort("当前会员模式不支持续费,请联系开发者");
}
}
});
item_bound_device.setOnSettingItemClick(new LSettingItem.onSettingItemClick() {
@Override
public void click(boolean isChecked) {
unbind();
}
});
if (buy) {
btn_opening_renewal.performClick();
}
}
private void unbind() {
if (LCUser.getCurrentUser() != null) {
progressDialog = new ProgressDialog(UserInfoActivity.this);
progressDialog.setMessage(getString(R.string.please_wait));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
ServiceDateUtils.getServerDate(new DateUtils.OnServerDateCallBack() {
@Override
public void get(Date serverDate) {
if (isFinishing()) return;
//查询条件为:查询今年开始时间,查询开年来的解绑次数
Date startOfAYear = DateUtils.addDayOfMonth(serverDate, -365, false, false);
LCQuery<LCObject> unbindDeviceQuery = new LCQuery<>("UnbindDevice");
unbindDeviceQuery.whereEqualTo("user", LCUser.getCurrentUser());
unbindDeviceQuery.limit(15)
.whereGreaterThan("updatedAt", startOfAYear)
.findInBackground().subscribe(new Observer<List<LCObject>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<LCObject> avObjects) {
progressDialog.dismiss();
if (avObjects != null) {
int totalTimes = 0;
if (LCUser.getCurrentUser().getInt("level") == 1) {
totalTimes = 5;
} else if (LCUser.getCurrentUser().getInt("level") == 10) {
totalTimes = 10;
}
final int leftTimes = Math.max(totalTimes - avObjects.size(), 0);
new MaterialDialog.Builder(UserInfoActivity.this)
.title(R.string.unbind_device)
.content(getString(R.string.number_of_untying_opportunities_at_your_membership_level) + ":" + totalTimes + "\n"
+ getString(R.string.your_remaining_untying_times_remain) + ":" + leftTimes)
.positiveText(R.string.unbind_device)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
if (leftTimes > 0) {
progressDialog = new ProgressDialog(UserInfoActivity.this);
progressDialog.setMessage(getString(R.string.please_wait));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
LCObject unbindDevice = new LCObject("UnbindDevice");
unbindDevice.put("user", LCUser.getCurrentUser());
if (LCUser.getCurrentUser().get("controlBoundDevice") != null)
unbindDevice.put("oldDevice", LCUser.getCurrentUser().get("controlBoundDevice"));
unbindDevice.put("success", true);
unbindDevice.saveInBackground().subscribe(new Observer<LCObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(LCObject avObject) {
LCUser.getCurrentUser().remove("controlBoundDevice");
LCUser.getCurrentUser().saveInBackground().subscribe(new Observer<LCObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(LCObject avObject) {
if (VipManager.getInstance().isControlBoundDevice) {
LCUser.logOut();
VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
progressDialog.dismiss();
new MaterialDialog.Builder(UserInfoActivity.this)
.title(R.string.unbind_device_success)
.content(R.string.unbind_device_success_next_to_do)
.positiveText(R.string.i_know)
.dismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult
finish();
}
})
.show();
}
@Override
public void onRefreshFailed(int errorCode) {
progressDialog.dismiss();
}
});
} else {
LCDeviceUtil.updateDeviceInfo("controlnetwork", ((App) Utils.getApp()).registerCodeV2, new LCDeviceUtil.OnDeviceUpdateListener() {
@Override
public void onUpdateSuccess() {
VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
progressDialog.dismiss();
item_bound_device.setRightText(VipManager.getInstance().boundName);
ToastUtils.showShort(R.string.unbind_device_success);
}
@Override
public void onRefreshFailed(int errorCode) {
progressDialog.dismiss();
ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode);
}
});
}
@Override
public void onUpdateFailed() {
progressDialog.dismiss();
}
});
}
}
@Override
public void onError(Throwable e) {
progressDialog.dismiss();
}
@Override
public void onComplete() {
}
});
}
@Override
public void onError(Throwable e) {
progressDialog.dismiss();
}
@Override
public void onComplete() {
}
});
} else {
ToastUtils.showLong(R.string.your_remaining_untying_times_remain_is_zero);
}
}
})
.negativeText(R.string.cancel)
.show();
}
}
@Override
public void onError(Throwable e) {
progressDialog.dismiss();
}
@Override
public void onComplete() {
}
});
}
@Override
public void error(Throwable throwable) {
progressDialog.dismiss();
Log.d("error", "unbind_device");
ToastUtils.showShort(R.string.get_server_date_failed);
}
});
} else {
ToastUtils.showShort(R.string.you_are_not_vip_no_need_unbind);
}
}
/**
* 刷新用户信息
*/
private void updateUserInfo() {
if (LCUser.getCurrentUser() != null) {
if (LCUser.getCurrentUser().getMobilePhoneNumber() != null)
item_phone.setRightText(LCUser.getCurrentUser().getMobilePhoneNumber());
if (LCUser.getCurrentUser().getEmail() != null)
item_email.setRightText(LCUser.getCurrentUser().getEmail());
if (VipManager.getInstance().controlBoundName != null)
item_bound_device.setRightText(VipManager.getInstance().controlBoundName);
fetchNickNameAndAvatar();
if (VipManager.getInstance().checkReg()) {
item_user_level.setRightText(getString(R.string.bound_device));
item_expiration.setVisibility(View.GONE);
} else if (VipManager.getInstance().level > 0) {
item_expiration.setVisibility(View.VISIBLE);
if (VipManager.getInstance().expireDate != null)
item_expiration.setRightText(DateUtils.toFull(VipManager.getInstance().expireDate));
if (VipManager.getInstance().isInExpireDate) {
switch (VipManager.getInstance().level) {
case 1:
item_user_level.setRightText(getString(R.string.user_level_1));
break;
case 10:
item_user_level.setRightText(getString(R.string.surveyor_life_vip));
break;
default:
item_user_level.setRightText(getString(R.string.user_level_unknown));
}
} else {
item_user_level.setRightText(getString(R.string.vip_expired));
}
} else {
item_user_level.setRightText(getString(R.string.user_level_0));
item_expiration.setVisibility(View.GONE);
}
if (VipManager.getInstance().controlLevel > 0) {
item_control_level.setVisibility(View.VISIBLE);
item_control_expiration.setVisibility(View.VISIBLE);
item_control_expiration.setRightText(DateUtils.toFull(VipManager.getInstance().controlExpireDate));
if (VipManager.getInstance().isControlInExpireDate) {
switch (VipManager.getInstance().controlLevel) {
case 1:
case 2:
item_control_level.setRightText(getString(R.string.user_level_try));
break;
case 3:
item_control_level.setRightText(getString(R.string.user_level_control_pro));
break;
}
} else {
item_control_level.setRightText(getString(R.string.vip_expired));
}
}
} else {
ToastUtils.showShort(R.string.not_log_in);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_activity_user_info, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.menu_activity_user_info_redeem_code:
if (AppChannel.customChannel != AppChannel.CUSTOM_CONTROL_PUBLIC) {
new AlertDialog.Builder(UserInfoActivity.this)
.setTitle(R.string.hint)
.setMessage("定制版本无法续费,只能以绑定手机形式使用")
.setPositiveButton(R.string.i_know, null)
.show();
} else if (LCUser.getCurrentUser().getInt("level") == 0 || LCUser.getCurrentUser().getInt("level") == 1) {
startActivityForResult(new Intent(UserInfoActivity.this, RedeemVipActivity.class), REQUEST_CODE_UPDATE_USER_INFO);
} else {
ToastUtils.showShort("当前会员模式不支持续费,请联系开发者");
}
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (grantResults.length > 0) {
if (requestCode == REQUEST_CODE_ASK_CAMERA) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
pickByTake();
} else {
ToastUtils.showShort(getString(R.string.please_granted_camera_permission));
}
} else {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_CODE_UPDATE_USER_INFO:
VipManager.getInstance().controlSdkRefresh(UserInfoActivity.this, ((App) Utils.getApp()).registerCodeV2, new VipManager.OnSdkRefreshListener() {
@Override
public void onRefreshSuccess() {
updateUserInfo();
}
@Override
public void onRefreshFailed(int errorCode) {
ToastUtils.showShort(getString(R.string.error_code) + ":" + errorCode);
}
});
break;
case UCrop.REQUEST_CROP:
final Uri resultUri = UCrop.getOutput(data);
try {
File compressedImage = new Compressor(UserInfoActivity.this)
.setMaxWidth(256)
.setMaxHeight(256)
.setQuality(50)
.setCompressFormat(Bitmap.CompressFormat.JPEG)
.compressToFile(new File(FileUtil.getRealPathFromUri(resultUri)));
updateProfileAvatar(compressedImage.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
break;
case UCrop.RESULT_ERROR:
final Throwable cropError = UCrop.getError(data);
if (cropError != null)
Log.d("cropError", cropError.getMessage());
break;
}
}
}
/**
* 编辑昵称
*/
public void showEditNicknameDialog() {
if (LCUser.getCurrentUser() == null) {
ToastUtils.showShort(R.string.not_log_in);
return;
}
DialogEditNicknameBinding dialogEditNicknameBinding = DialogEditNicknameBinding.inflate(LayoutInflater.from(this));
MaterialDialog dialog = new MaterialDialog.Builder(this)
.title(R.string.edit_nickname)
.customView(dialogEditNicknameBinding.getRoot(), false)
.onPositive((dialog1, which) -> {
final String nickname = dialogEditNicknameBinding.metDialogEditNickname.getText().toString();
LCUser.getCurrentUser().put("nickname", nickname);
LCUser.getCurrentUser().saveInBackground().subscribe();
ToastUtils.showShort(R.string.edit_nickname_success);
tv_nick_name.setText(nickname);
((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult
})
.positiveText(getString(R.string.save))
.negativeText(getString(R.string.cancel))
.dismissListener(dialog12 ->
dialogEditNicknameBinding.metDialogEditNickname.clearFocus())
.build();
mPositiveAction = dialog.getActionButton(DialogAction.POSITIVE);
if (SettingValueUtil.isThemeDark()) {
dialogEditNicknameBinding.metDialogEditNickname.setMetTextColor(Color.WHITE);
dialogEditNicknameBinding.metDialogEditNickname.setPrimaryColor(Color.LTGRAY);
dialogEditNicknameBinding.metDialogEditNickname.setFocusFraction(1.0f);
dialogEditNicknameBinding.metDialogEditNickname.setMetHintTextColor(Color.GRAY);
dialogEditNicknameBinding.metDialogEditNickname.setUnderlineColor(Color.GRAY);
}
TextWatcher watcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
String nickname_text = s == null ? "" : s.toString();
mPositiveAction.setEnabled(ValidateUtil.isNickName(nickname_text));
}
};
dialogEditNicknameBinding.metDialogEditNickname.addTextChangedListener(watcher);
dialog.show();
mPositiveAction.setEnabled(false);
}
/**
* 编辑头像
*/
private void showProfileAvatarChangeDialog() {
new MaterialDialog.Builder(this)
.title(R.string.change_profile_avatar)
.positiveText(R.string.pick_by_select)
.negativeText(R.string.pick_by_take)
.neutralText(R.string.cancel)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) {
pickBySelect();
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull @NotNull MaterialDialog dialog, @NonNull @NotNull DialogAction which) {
pickByTake();
}
})
.show();
}
/**
* 相册选择照片
*/
@SuppressLint("CheckResult")
public void pickBySelect() {
rxImagePicker.openGallery(this, new WechatConfigrationBuilder(MimeType.INSTANCE.ofImage(), false)
.capture(true)
.maxSelectable(1)
.countable(true)
.spanCount(4)
.countable(false)
.build())
.subscribe(rxImagePickerConsumerOnNext, rxImagePickerConsumerOnError);
}
/**
* 拍照片
*/
@SuppressLint("CheckResult")
public void pickByTake() {
if ((PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.CAMERA))) {
ActivityCompat.requestPermissions(UserInfoActivity.this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_CAMERA);
} else {
rxImagePicker.openCamera(this).subscribe(rxImagePickerConsumerOnNext, rxImagePickerConsumerOnError);
}
}
Consumer<Result> rxImagePickerConsumerOnNext = new Consumer<Result>() {
@Override
public void accept(Result result) throws Exception {
boolean originalMode = result.getBooleanExtra(WechatImagePickerFragment.EXTRA_ORIGINAL_IMAGE, false);
// String mimeType = result.getStringExtra(WechatImagePickerFragment.EXTRA_OPTIONAL_MIME_TYPE, "");
Log.d(TAG, "select image original:" + originalMode + " , uri path: " + FileUtil.getRealPathFromUri(result.getUri()));
UCrop.of(result.getUri(), result.getUri())
.withAspectRatio(1, 1)
.withMaxResultSize(256, 256)
.start(UserInfoActivity.this);
}
};
Consumer<Throwable> rxImagePickerConsumerOnError = new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) {
ToastUtils.showShort("打开图片失败");
}
};
/**
* 更新云端头像
*
* @param path
*/
private void updateProfileAvatar(String path) {
try {
final LCFile file = LCFile.withAbsoluteLocalPath("avatar.jpg", path);
if (LCUser.getCurrentUser() != null) {
LCUser.getCurrentUser().put("avatar", file);
LCUser.getCurrentUser().saveInBackground().subscribe(new Observer<LCObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(LCObject lcObject) {
Glide.with(UserInfoActivity.this).load(file.getUrl()).into(avatarImageView);
ToastUtils.showShort(R.string.update_avatar_success);
((App) Utils.getApp()).isUserStatusChanged = true;//返回MainActivity时updateHeaderResult
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
} else {
ToastUtils.showShort(R.string.not_log_in);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void fetchNickNameAndAvatar() {
if (LCUser.getCurrentUser() != null) {
String nickname = LCUser.getCurrentUser().getString("nickname");
LCFile avatarFile = LCUser.getCurrentUser().getLCFile("avatar");
if (!StringUtils.isEmpty(nickname)) {
tv_nick_name.setText(nickname);
if (avatarFile == null) {
avatarImageView.setImageResource(R.mipmap.profile_image);
} else {
Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView);
}
} else {
LCObject userProfile = LCUser.getCurrentUser().getLCObject("profile");
if (userProfile != null) {
userProfile.fetchInBackground().subscribe(new Observer<LCObject>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(LCObject avObject) {
if (isFinishing()) return;
String nickname = avObject.getString("nickname");
LCFile avatarFile = avObject.getLCFile("avatar");
if (!StringUtils.isEmpty(nickname)) {
tv_nick_name.setText(nickname);
if (avatarFile == null) {
avatarImageView.setImageResource(R.mipmap.profile_image);
} else {
Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView);
}
//保存到_User,下次不再查Profile
LCUser.getCurrentUser().put("nickname", nickname);
if (avatarFile != null)
LCUser.getCurrentUser().put("avatar", avatarFile);
LCUser.getCurrentUser().saveInBackground().subscribe();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
} else {
new LCQuery<>("Profile")
.whereEqualTo("creatorId", LCUser.getCurrentUser().getObjectId())
.findInBackground()
.subscribe(new Observer<List<LCObject>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<LCObject> list) {
if (isFinishing()) return;
if (list != null && !list.isEmpty()) {
String nickname = list.get(0).getString("nickname");
LCFile avatarFile = list.get(0).getLCFile("avatar");
if (!StringUtils.isEmpty(nickname)) {
tv_nick_name.setText(nickname);
if (avatarFile == null) {
avatarImageView.setImageResource(R.mipmap.profile_image);
} else {
Glide.with(UserInfoActivity.this).load(avatarFile.getUrl()).into(avatarImageView);
}
//保存到_User,下次不再查Profile
LCUser.getCurrentUser().put("nickname", nickname);
if (avatarFile != null)
LCUser.getCurrentUser().put("avatar", avatarFile);
LCUser.getCurrentUser().saveInBackground().subscribe();
}
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}
} else {
tv_nick_name.setText(getString(R.string.please_log_in_again));
}
}
}

@ -7,12 +7,14 @@ import android.view.View;
import com.bingce.controlapphelper.datasource.database.SurveyorDatabaseFactory;
import com.bingce.controlapphelper.datasource.database.project.IProjectDataSource;
import com.bingce.controlapphelper.datasource.database.project.ProjectRecord;
import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetailDataSource;
import com.bingce.controlapphelper.datasource.database.tolerance.detail.ToleranceDetailRecord;
import com.bingce.controlapphelper.datasource.database.tolerance.detail.IToleranceDetail;
import com.bingce.controlapphelper.datasource.database.tolerance.load.IToleranceOperate;
import com.bingce.controlapphelper.datasource.database.tolerance.load.ToleranceLoadUtil;
import com.bingce.controlapphelper.model.BundleConstants;
import com.bingce.controlapphelper.util.SurveyorRecordUtil;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.activity.fragmentcontainer.FragmentContainerActivity;
import com.bingce.controlnetwork.util.tolerance.ToleranceOperateUtil;
import com.bingce.utils.ThreadPoolUtil;
import blankj.utilcode.util.ToastUtils;
@ -55,23 +57,15 @@ public class ProjectToleranceSettingFragment extends AbstractProjectToleranceFra
if (projectRecord == null) {
return;
}
String projectToleranceId = projectRecord.getToleranceId();
//读取'限差方案'名称
IToleranceDetailDataSource toleranceDataSource = SurveyorDatabaseFactory
.instance
.getToleranceDetailDataSource();
ToleranceDetailRecord instance = toleranceDataSource.getRecordSync(projectToleranceId);
//设置限差详情
if (instance == null) {
//修改项目限差配置
toleranceDataSource.getDefaultRecord(defaultRecord -> {
projectRecord.setToleranceId(defaultRecord.getId());
projectDataSource.saveRecordSync(projectRecord);
updateToleranceDetail(view, defaultRecord);
});
IToleranceOperate operate = ToleranceOperateUtil.getOperate(projectRecord.getToleranceId());
if (operate == null) {
IToleranceDetail defaultRecord = ToleranceLoadUtil.getToleranceLoad(projectType).getNewDefaultTolerance(projectType);
updateToleranceDetail(view, defaultRecord);
} else {
updateToleranceDetail(view, instance);
}
IToleranceDetail lastToleranceDetail = operate.getIToleranceDetail(projectRecord.getToleranceId());
updateToleranceDetail(view, lastToleranceDetail);
}
});
}

@ -20,7 +20,6 @@ import com.bingce.controlapphelper.datasource.database.surveyorcycle.ISurveyorPe
import com.bingce.controlapphelper.datasource.database.surveyorcycle.SurveyorPeriodRecord;
import com.bingce.controlapphelper.datasource.database.surveyorstation.ISurveyorStationDataSource;
import com.bingce.controlapphelper.datasource.database.surveyorstation.SurveyorStationRecord;
import com.bingce.controlapphelper.surveyor.method.ExportUtils;
import com.bingce.controlapphelper.util.CheckStorageUtil;
import com.bingce.controlapphelper.util.StationUtil;
import com.bingce.controlapphelper.util.Tools;
@ -101,7 +100,7 @@ public class SelectExportSurveyorRecordFragment extends BaseFragment {
nodeList.add(root);
while (!nodeList.isEmpty()) {
TreeNode first = nodeList.remove(0);
if (first.isEnable() && first.isSelected() && first.getValue().getValue() instanceof ExportUtils.ExportItem) {
if (first.isEnable() && first.isSelected() && first.getValue().getValue() instanceof ExportUtilsPla.ExportItem) {
exportItem.add((ExportUtilsPla.ExportItem) first.getValue().getValue());
}
nodeList.addAll(first.getChildren());
@ -166,8 +165,8 @@ public class SelectExportSurveyorRecordFragment extends BaseFragment {
if (stationRecord == null) {
continue;
}
ExportUtils.ExportItem exportItem =
new ExportUtils.ExportItem(projectRecord.getProjectName(), projectRecord.getId(),
ExportUtilsPla.ExportItem exportItem =
new ExportUtilsPla.ExportItem(projectRecord.getProjectName(), projectRecord.getId(),
projectRecord.projectType,
periodRecord.getId(), periodRecord.getName(),
stationRecord.getId(),

@ -117,7 +117,7 @@ public class SelectExportSurveyorRecordWireFileFragment extends BaseFragment {
// List<ExportUtils.ExportItem> exportCompleteLoopList = getExportProjectPeridList(root);
//执行导出
String exportFolder = "导线助手导出文件" + File.separator + "导线文件导出";
String exportFolder = "控制测量电子手薄导出文件" + File.separator + "导线文件导出";
List<File> files = ExportUtils.doExportWire(context, exportItem, exportFolder);
//将文件存储到一个zip中

@ -101,7 +101,8 @@ class LevelExportSingalHeight {
* 已知点
*/
private fun collectPoint(projectId: String) {
val pointList = SurveyorDatabaseFactory.instance.pointDataSource.findByProjectIdSync(projectId)
val pointList =
SurveyorDatabaseFactory.instance.pointDataSource.findByProjectIdSync(projectId)
for (point in pointList) {
if (PointRecord.TYPE_KNOWN_POINT == point.pointType) {
pointKnownSb.append(point.getName()).append(_S).append(point.getZFormat(4))
@ -117,7 +118,7 @@ class LevelExportSingalHeight {
* 收集尺长
*/
private fun collectRulerLength(projectId: String) {
val routeList = SurveyorDatabaseFactory.instance.pointDataSource.findByProjectIdSync(projectId)
val routeList = LevelingDbFactory.instance.levelDataSource.getByProjectIdSync(projectId)
for (route in routeList) {
val latest = LevelingDbFactory.instance.stationSettingDataSource.getLatest(route.id)
@ -197,7 +198,8 @@ class LevelExportSingalHeight {
}
private fun getPointName(pointId: String): String {
return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(pointId)?.getName() ?: ""
return SurveyorDatabaseFactory.instance.pointDataSource.findByIdSync(pointId)?.getName()
?: ""
}
private fun getRouteNum(): String {

@ -138,10 +138,11 @@ public class ProjectDetailLevelFragment extends BaseFragment {
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.project_parameter_setting) {
//设置参数点击事件
//限差设置
ProjectToleranceSettingFragment.start(getContext(), projectId, projectType);
return true;
} else if (R.id.iAngleDetection == item.getItemId()) {
//i角检测
LevelIDetectionListActivity.launch(requireContext(), projectId);
}
return super.onOptionsItemSelected(item);

@ -8,12 +8,8 @@ import android.view.MenuItem
import android.view.View
import android.widget.EditText
import androidx.activity.viewModels
import androidx.lifecycle.lifecycleScope
import blankj.utilcode.util.ToastUtils
import com.bingce.controlnetwork.func.level.idetection.viewmodel.LevelIDetectionRecordVm
import com.bingce.controlnetwork.func.level.sendreceive.ILevelBackData
import com.bingce.controlnetwork.func.level.sendreceive.LevelRequest
import com.bingce.controlnetwork.func.level.sendreceive.LevelRequestRelease
import com.bingce.controlnetwork.newui.widget.selectitem.SelectIDetectionStationFragment
import com.bingce.controlapphelper.datasource.database.leveling.idetection.constants.LevelIDetectionConstant
import com.bingce.controlapphelper.datasource.database.leveling.idetection.constants.LevelIDetectionConstant.I_A_B_I
import com.bingce.controlapphelper.datasource.database.leveling.idetection.list.LevelIDetectionList
@ -28,12 +24,20 @@ import com.bingce.controlnetwork.fragment.TipsFragment
import com.bingce.controlnetwork.func.level.fragment.LevelInputAllowFragment
import com.bingce.controlnetwork.func.level.fragment.LevelInputFragment
import com.bingce.controlnetwork.func.level.idetection.adapter.LevelIDetectionRecordAdapter
import com.bingce.controlnetwork.func.level.idetection.viewmodel.LevelIDetectionRecordVm
import com.bingce.controlnetwork.func.level.sendreceive.ILevelBackData
import com.bingce.controlnetwork.func.level.sendreceive.LevelRequest
import com.bingce.controlnetwork.func.level.sendreceive.LevelRequestRelease
import com.bingce.controlnetwork.newui.base.BaseBindingActivity
import com.bingce.controlnetwork.newui.widget.selectitem.BaseSelectItemFragment
import com.bingce.controlnetwork.newui.widget.selectitem.SelectIDetectionStationFragment
import com.bingce.controlnetwork.newui.widget.selectitem.SelectIDetectionStationMeasureTypeFragment
import com.bingce.controlnetwork.util.DialogUtil
import com.bingce.controlnetwork.util.StationSettingCheckUtil
import com.bingce.utils.ScreenUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
@ -157,18 +161,24 @@ class LevelIDetectionRecordActivity : BaseBindingActivity<ActivityLevelIDetectio
return
}
//存短长距和测量方式
viewModel.saveShortLongDistanceMeasureType(d1String, d2String)
//计算结果
val result = viewModel.startResult(getD(d1String), getD(d2String))
if (!TextUtils.isEmpty(result)) {
DialogUtil.showAlertDialog(
this,
supportFragmentManager,
this,
result
)
lifecycleScope.launch {
withContext(Dispatchers.IO) {
//存短长距和测量方式
viewModel.saveShortLongDistanceMeasureType(d1String, d2String)
}
//计算结果
val result = viewModel.startResult(getD(d1String), getD(d2String))
if (!TextUtils.isEmpty(result)) {
DialogUtil.showAlertDialog(
this@LevelIDetectionRecordActivity,
supportFragmentManager,
this@LevelIDetectionRecordActivity,
result
)
}
}
}
private fun getEtText(et: EditText): String {

@ -4,9 +4,6 @@ import androidx.annotation.WorkerThread
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import blankj.utilcode.util.ToastUtils
import com.bingce.controlnetwork.func.level.idetection.LevelIDetectionCalUtil
import com.bingce.controlnetwork.func.level.idetection.LevelIDetectionSurveyorData
import com.bingce.controlnetwork.func.level.idetection.util.LevelIDetectionFindUtil
import com.bingce.controlapphelper.datasource.database.leveling.LevelingDb
import com.bingce.controlapphelper.datasource.database.leveling.LevelingDbFactory
import com.bingce.controlapphelper.datasource.database.leveling.idetection.constants.LevelIDetectionConstant
@ -21,6 +18,9 @@ import com.bingce.controlapphelper.datasource.database.leveling.idetection.list.
import com.bingce.controlapphelper.datasource.database.leveling.idetection.record.LevelIDetectionRecord
import com.bingce.controlapphelper.leveling.detaction.LevelFormatUtil
import com.bingce.controlapphelper.util.Tools
import com.bingce.controlnetwork.func.level.idetection.LevelIDetectionCalUtil
import com.bingce.controlnetwork.func.level.idetection.LevelIDetectionSurveyorData
import com.bingce.controlnetwork.func.level.idetection.util.LevelIDetectionFindUtil
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -306,14 +306,12 @@ class LevelIDetectionRecordVm : ViewModel() {
* 这些变化快统一存
*/
fun saveShortLongDistanceMeasureType(d1Short: String, d2Long: String) {
viewModelScope.launch(Dispatchers.IO) {
val iDetectionItem =
LevelingDbFactory.instance.iDetectionListDataSource.getById(surveyorData.currentIDetectionId)
iDetectionItem.shortDistance = d1Short
iDetectionItem.longDistance = d2Long
iDetectionItem.measureType = measureType
LevelingDbFactory.instance.iDetectionListDataSource.update(iDetectionItem)
}
val iDetectionItem =
LevelingDbFactory.instance.iDetectionListDataSource.getById(surveyorData.currentIDetectionId)
iDetectionItem.shortDistance = d1Short
iDetectionItem.longDistance = d2Long
iDetectionItem.measureType = measureType
LevelingDbFactory.instance.iDetectionListDataSource.update(iDetectionItem)
}
fun getGetDadaAuto(iDetectionId: String, callBack: (Boolean) -> Unit) {

@ -324,8 +324,12 @@ class LevelExportUtilTj {
val sb = StringBuilder()
for (item in observationConditionList) {
if (item.stationId==null) {
continue
}
val station =
LevelingDbFactory.instance.stationDataSource.getRecordSync(item.stationId)
?: continue
val stationNum = station.stationName.replace("测站", "")
//第一行

@ -46,13 +46,17 @@ public abstract class BaseAdapterNew<VH extends RecyclerView.ViewHolder, T> exte
@Override
public void onBindViewHolder(@NonNull VH holder, int position) {
holder.itemView.setOnClickListener(v -> {
if (mItemClickListener != null) {
mItemClickListener.clickItem(mDataList.get(holder.getBindingAdapterPosition()));
if (mItemClickListener != null && position < mDataList.size()) {
mItemClickListener.clickItem(mDataList.get(position));
}
});
holder.itemView.setOnCreateContextMenuListener((menu, v, menuInfo) ->
createMenu(menu, mDataList.get(holder.getBindingAdapterPosition())));
holder.itemView.setOnCreateContextMenuListener((menu, v, menuInfo) -> {
if (position < mDataList.size()) {
createMenu(menu, mDataList.get(position));
}
}
);
onBindViewHolderDo(holder, position);
}

@ -109,7 +109,7 @@ public class SelectMeasureDataExportTypeFragment extends BottomSheetDialogFragme
}
private void initData() {
dataList.add(new SelectExportType("导线助手格式", SelectExportType.TYPE_CONTROL));
dataList.add(new SelectExportType("控制测量电子手簿格式", SelectExportType.TYPE_CONTROL));
dataList.add(new SelectExportType("科傻格式", SelectExportType.TYPE_KE_SHA));
dataList.add(new SelectExportType("南方平差易格式", SelectExportType.TYPE_NAN_FANG));
dataList.add(new SelectExportType("启飞格式", SelectExportType.TYPE_QI_FEI));

@ -11,15 +11,12 @@ import android.view.ViewGroup
import androidx.fragment.app.activityViewModels
import blankj.utilcode.util.ToastUtils
import blankj.utilcode.util.Utils
import cn.leancloud.LCUser
import com.bingce.controlnetwork.R
import com.bingce.controlnetwork.activity.AboutActivity
import com.bingce.controlnetwork.activity.SettingsActivity
import com.bingce.controlnetwork.activity.ViewRecentCrashActivity
import com.bingce.controlnetwork.activity.backup.BackupExportActivity
import com.bingce.controlnetwork.activity.backup.launch.BackupImportHelper
import com.bingce.controlnetwork.activity.user.LoginActivity
import com.bingce.controlnetwork.activity.user.UserInfoActivity
import com.bingce.controlnetwork.databinding.NewFragmentMeBinding
import com.bingce.controlnetwork.newui.base.BaseFragmentBinding
import com.bingce.controlnetwork.viewmodel.MainActivityViewModel
@ -87,13 +84,13 @@ class MeFragment : BaseFragmentBinding<NewFragmentMeBinding>() {
startActivity(Intent(requireContext(), AboutActivity::class.java))
}
mBinding.llUser.setOnClickListener {
if (LCUser.getCurrentUser() != null) {
startActivity(Intent(requireContext(), UserInfoActivity::class.java))
} else {
val intent = Intent(Utils.getApp(), LoginActivity::class.java)
intent.putExtra("finishTo", UserInfoActivity::class.java.name)
startActivity(intent)
}
// if (LCUser.getCurrentUser() != null) {
// startActivity(Intent(requireContext(), UserInfoActivity::class.java))
// } else {
// val intent = Intent(Utils.getApp(), LoginActivity::class.java)
// intent.putExtra("finishTo", UserInfoActivity::class.java.name)
// startActivity(intent)
// }
}
mBinding.llViewException.setOnClickListener {

@ -32,7 +32,9 @@ import com.bingce.controlapphelper.util.Tools;
import com.bingce.controlnetwork.App;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.newui.configfragment.SelectExportType;
import com.bingce.controlnetwork.util.CheckRegUtil;
import com.bingce.utils.DateUtils;
import com.bingce.utils.RegisterUtil;
import com.bingce.utils.Util;
import com.bingce.utils.VipManager;
import com.bingce.zip.ZipUtil;
@ -166,8 +168,8 @@ public class ExportUtilsPla {
@WorkerThread
private static void exportBingCe(Project project, ToleranceDetailRecord toleranceRecord, File projectCachedDir) {
String controlPointTxtPrint = getControlPointTxtPrint(project);
String projectTxtPrint = getProjectTxtPrint(project);
// String controlPointTxtPrint = getControlPointTxtPrint(project);
// String projectTxtPrint = getProjectTxtPrint(project);
//读取「限差」信息
//二级
@ -234,21 +236,42 @@ public class ExportUtilsPla {
ExportStationMethod.save(" ", periodFolder, "边长.TXT");
}
//导出控制点文件
exportControlTxt(periodFolder, controlPointTxtPrint);
//导出项目文件
exportProjectTxt(periodFolder, projectTxtPrint);
exportProjectAndControlPoint(project,projectCachedDir);
}
}
private static void exportProjectTxt(File exportFolder, String data) {
ExportStationMethod.save(data, exportFolder, "project.TXT");
}
private static void exportControlTxt(File exportFolder, String data) {
ExportStationMethod.save(data, exportFolder, "controlpoint.TXT");
/**
* 导出项目和控制点文件
*
* @param project
* @param projectDir
*/
private static void exportProjectAndControlPoint(Project project, File projectDir) {
//存储已知点
List<PointRecord> surveyorPointRecordListInAllPeriods = surveyorPointRecordListInAllPeriods(project);
StringBuilder pointStringBuilder = new StringBuilder();
for (PointRecord pointRecord : surveyorPointRecordListInAllPeriods) {
if (pointRecord == null) {
continue;
}
if (PointRecord.TYPE_KNOWN_POINT.equals(pointRecord.pointType) ||
PointRecord.TYPE_GLOBAL_POINT.equals(pointRecord.pointType)) {
pointStringBuilder
.append(pointRecord.getName())
.append(",")
.append(pointRecord.getXFormat(4))
.append(",")
.append(pointRecord.getYFormat(4))
.append(",")
.append(pointRecord.getZFormat(4))
.append("\n");
}
}
//导出控制点文件
ExportStationMethod.save(pointStringBuilder.toString(), projectDir, "controlpoint.TXT");
//导出项目名称和项目类型文件
ExportStationMethod.save(project.projectName + "," + project.projectType + "\n", projectDir, "project.TXT");
}
private static String getControlPointTxtPrint(Project project) {
@ -1018,40 +1041,6 @@ public class ExportUtilsPla {
}
}
/**
* 导出项目和控制点文件
*
* @param project
* @param projectDir
*/
private static void exportProjectAndControlPoint(Project project, File projectDir) {
//存储已知点
List<PointRecord> surveyorPointRecordListInAllPeriods = surveyorPointRecordListInAllPeriods(project);
StringBuilder pointStringBuilder = new StringBuilder();
for (PointRecord pointRecord : surveyorPointRecordListInAllPeriods) {
if (pointRecord == null) {
continue;
}
if (PointRecord.TYPE_KNOWN_POINT.equals(pointRecord.pointType) ||
PointRecord.TYPE_GLOBAL_POINT.equals(pointRecord.pointType)) {
pointStringBuilder
.append(pointRecord.getName())
.append(",")
.append(pointRecord.getXFormat(4))
.append(",")
.append(pointRecord.getYFormat(4))
.append(",")
.append(pointRecord.getZFormat(4))
.append("\n");
}
}
//导出控制点文件
ExportStationMethod.save(pointStringBuilder.toString(), projectDir, "controlpoint.TXT");
//导出项目名称和项目类型文件
ExportStationMethod.save(project.projectName + "," + project.projectType + "\n", projectDir, "project.TXT");
}
/**
* 导出平差之星
*/
@ -1566,7 +1555,7 @@ public class ExportUtilsPla {
}
public static boolean isCanExport() {
if (VipManager.getInstance().checkVipReg()) {
if (CheckRegUtil.checkReg(App.getApp().registerCodeV2)) {
return true;
}
ToastUtils.showShort("您暂无使用权限,请联系客服");

@ -215,12 +215,12 @@ class _DoSurveyorState extends __BaseState implements ISurveyorListener, ISurvey
navigation2(StateType.checkReadData);
break;
case RESULT_FAILURE_EXCEED_MAX:
// boolean allowAbandon = getStation().isAllowAbandon();
if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) {
dealErrorDataSkip(msg);
} else {
dealErrorDataNormal(msg);
}
// if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) {
// dealErrorDataSkip(msg);
// } else {
// dealErrorDataNormal(msg);
// }
dealErrorDataNormal(msg);
break;
case RESULT_FAILURE_ERROR:
dealErrorDataNormal(msg);

@ -16,7 +16,6 @@ import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorListener;
import com.bingce.controlapphelper.surveyor.surveyor.ISurveyorRemindListener;
import com.bingce.controlapphelper.surveyor.surveyor.RequestSurveyorParam;
import com.bingce.controlapphelper.util.DebugMsgUtil;
import com.bingce.controlapphelper.util.SettingValueUtil;
import com.bingce.controlapphelper.util.Tools;
import com.bingce.controlnetwork.R;
import com.bingce.controlnetwork.surveyor.state.StateConstants;
@ -163,12 +162,12 @@ class _DoSurveyorState extends __BaseState implements ISurveyorListener, ISurvey
navigation2(StateType.checkTolerance);
break;
case RESULT_FAILURE_EXCEED_MAX:
// boolean allowAbandon = getStation().isAllowAbandon();
if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) {
dealErrorDataSkip(msg);
} else {
dealErrorDataNormal(msg);
}
// if (SettingValueUtil.isAbandonPoint() && isAllowAbandonForVarifyIndex()) {
// dealErrorDataSkip(msg);
// } else {
// dealErrorDataNormal(msg);
// }
dealErrorDataNormal(msg);
break;
case RESULT_FAILURE_ERROR:
dealErrorDataNormal(msg);

@ -1,21 +0,0 @@
package com.bingce.controlnetwork.ui;
import android.content.Context;
import com.qingmei2.rximagepicker.entity.Result;
import com.qingmei2.rximagepicker.entity.sources.Camera;
import com.qingmei2.rximagepicker.entity.sources.Gallery;
import com.qingmei2.rximagepicker.ui.ICustomPickerConfiguration;
import com.qingmei2.rximagepicker_extension_wechat.ui.WechatImagePickerActivity;
import io.reactivex.Observable;
public interface WechatImagePicker {
@Gallery(componentClazz = WechatImagePickerActivity.class,
openAsFragment = false)
Observable<Result> openGallery(Context context, ICustomPickerConfiguration config);
@Camera
Observable<Result> openCamera(Context context);
}

@ -0,0 +1,67 @@
package com.bingce.controlnetwork.util;
import static com.bingce.utils.RegisterUtil.getOriginalMachineCode;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Build;
import androidx.core.content.ContextCompat;
import com.bingce.AppChannel;
import com.bingce.BaseApp;
import com.bingce.utils.ActivateUtil;
import com.bingce.utils.AppUtil;
import blankj.utilcode.util.Utils;
public class CheckRegUtil {
/**
* 检查注册码是否有效仅限offline调用
*
* @return
* @reg_code 激活码
*/
public static boolean checkReg(String reg_code) {
if (!((BaseApp) Utils.getApp()).userAgreementAgree)
return false;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {//Q=10,大于安卓10的可能是手薄,不需要检测电话权限
if (ContextCompat.checkSelfPermission(Utils.getApp(), Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// ToastUtils.showShort("为了认证激活信息,请打开读取手机状态权限");
return false;
}
}
if (AppChannel.customChannel != AppChannel.CUSTOM_INTERNATIONAL
&& AppChannel.customChannel != AppChannel.CUSTOM_TERSUS_INTERNATIONAL
&& AppChannel.customChannel != AppChannel.CUSTOM_PENTAX_INTERNATIONAL
&& AppChannel.customChannel != AppChannel.CUSTOM_SURVEY_SPACE_INTERNATIONAL
&& AppChannel.customChannel != AppChannel.CUSTOM_TUNNEL_AUTO_SCAN) {
if (!AppUtil.isZhCN())//国内发行版本在非简体中文语言下不可用
return false;
}
if ("".equals(getOriginalMachineCode())
|| "SERIALNUMBERunknown".equals(getOriginalMachineCode())
|| "SERIALNUMBERnull".equals(getOriginalMachineCode())
|| "SERIALNUMBER".equals(getOriginalMachineCode())) {
return false;
}
//开始验证
String machineCode = getOriginalMachineCode();
String answer;
if (machineCode != null) {
answer = "";
String md5 = ActivateUtil.encrypt(Utils.getApp(), machineCode, AppChannel.customChannel);
if (md5 != null) {
for (int i = 0; i < md5.length(); i++) {
if (i % 2 == 1)
answer += md5.charAt(i);
}
answer = answer.toUpperCase();
return reg_code.equals(answer);
} else {//如果返回null,说明破解打包了
return false;
}
}
return false;
}
}

@ -69,7 +69,8 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:text="@string/activate_tutorial" />
android:text="@string/activate_tutorial"
android:visibility="gone" />
</LinearLayout>
</LinearLayout>

@ -1,65 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<com.github.ybq.android.spinkit.SpinKitView
android:id="@+id/spin_kit"
style="@style/SpinKitView.CubeGrid"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:visibility="invisible"
app:SpinKit_Color="@color/md_blue_200"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<include layout="@layout/toolbar" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_completed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/data_collection"
android:textColor="#333333"
android:textSize="20sp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="@id/spin_kit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/spin_kit" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintBottom_toTopOf="@id/share_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spin_kit">
<com.github.ybq.android.spinkit.SpinKitView
android:id="@+id/spin_kit"
style="@style/SpinKitView.CubeGrid"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:visibility="invisible"
app:SpinKit_Color="@color/md_blue_200"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/progress_text"
android:layout_width="match_parent"
android:id="@+id/tv_completed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="#333333" />
</androidx.core.widget.NestedScrollView>
android:text="@string/data_collection"
android:textColor="#333333"
android:textSize="20sp"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="@id/spin_kit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/spin_kit" />
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
app:layout_constraintBottom_toTopOf="@id/share_button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spin_kit">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/progress_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="#333333" />
</androidx.core.widget.NestedScrollView>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/share_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:enabled="true"
android:text="@string/collect_data"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/share_button"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:enabled="true"
android:text="@string/collect_data"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -1,137 +1,148 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<include layout="@layout/toolbar" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/work_layout"
android:layout_width="0dp"
android:layout_height="0dp"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
<com.github.ybq.android.spinkit.SpinKitView
android:id="@+id/spin_kit"
style="@style/SpinKitView.CubeGrid"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:visibility="visible"
app:SpinKit_Color="@color/md_blue_200"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_completed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/data_import_successful"
android:textColor="#333333"
android:textSize="20sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/spin_kit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/spin_kit" />
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_view"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/work_layout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="30dp"
app:layout_constraintBottom_toTopOf="@id/next"
android:visibility="invisible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spin_kit">
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
<com.github.ybq.android.spinkit.SpinKitView
android:id="@+id/spin_kit"
style="@style/SpinKitView.CubeGrid"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="50dp"
android:visibility="visible"
app:SpinKit_Color="@color/md_blue_200"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/progress_text"
android:layout_width="match_parent"
android:id="@+id/tv_completed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="#333333" />
</androidx.core.widget.NestedScrollView>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/back"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="35dp"
android:enabled="false"
android:text="@string/back"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/next"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="35dp"
android:enabled="false"
android:text="@string/finish"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
android:text="@string/data_import_successful"
android:textColor="#333333"
android:textSize="20sp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@id/spin_kit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@id/spin_kit" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout2"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/layout2_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="60dp"
android:elevation="3dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_campaign_24" />
<androidx.core.widget.NestedScrollView
android:id="@+id/scroll_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="30dp"
app:layout_constraintBottom_toTopOf="@id/next"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/spin_kit">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/backup_from_zip"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:text="@string/import_data_from_backup_file"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/layout2_icon" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/progress_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:textColor="#333333" />
</androidx.core.widget.NestedScrollView>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/back"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="35dp"
android:enabled="false"
android:text="@string/back"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/next"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="35dp"
android:enabled="false"
android:text="@string/finish"
android:textColor="@color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/enter_app_direct"
style="@style/Widget.AppCompat.Button.Colored"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/layout2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:layout_marginBottom="40dp"
android:text="@string/go_directly_to_the_application"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:visibility="visible">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/layout2_icon"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginTop="60dp"
android:elevation="3dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/ic_baseline_campaign_24" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/backup_from_zip"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:text="@string/import_data_from_backup_file"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/layout2_icon" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/enter_app_direct"
style="@style/Widget.AppCompat.Button.Colored"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="40dp"
android:layout_marginBottom="40dp"
android:text="@string/go_directly_to_the_application"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

@ -5,6 +5,13 @@
android:layout_height="match_parent"
android:orientation="vertical">
<include
layout="@layout/new_item_slide_delete_hint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:visibility="visible" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -18,5 +17,6 @@
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="end|top"
android:text="@string/btn_tolerance_manager" />
android:text="@string/btn_tolerance_manager"
android:visibility="gone" />
</FrameLayout>

@ -1,48 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/iv"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@mipmap/profile_cover"
app:layout_constraintDimensionRatio="h,16:9"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:orientation="vertical"
android:padding="12dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/corners_edit_white_chatui"
android:orientation="vertical"
android:padding="12dp"
app:layout_constraintBottom_toBottomOf="@+id/iv"
app:layout_constraintLeft_toLeftOf="@+id/iv"
app:layout_constraintRight_toRightOf="@+id/iv"
app:layout_constraintTop_toTopOf="@+id/iv">
<TextView
android:id="@+id/tvUnit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/color_333333"
android:textSize="16sp"
android:visibility="gone" />
<TextView
android:id="@+id/tvVersion"
android:layout_width="wrap_content"
android:background="@drawable/round_white_16"
android:orientation="vertical">
<LinearLayout
android:id="@+id/llAbout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textColor="@color/color_999999"
android:textSize="14sp" />
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="12dp">
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@mipmap/ic_me_about" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_weight="1"
android:text="版本号"
android:textColor="@color/text_color_1"
android:textSize="@dimen/text_size_one" />
<TextView
android:id="@+id/tvVersion"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/text_color_1"
android:textSize="@dimen/text_size_two" />
</LinearLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</LinearLayout>

@ -14,8 +14,8 @@
android:orientation="vertical"
android:paddingHorizontal="16dp"
app:name="左右角测量"
app:offText="左右角平均值之和与360°较差不能超过4"
app:offText="左右角平均值之和与360°较差不能超过4''"
app:onChecked="false"
app:onText="左右角平均值之和与360°较差不能超过4" />
app:onText="左右角平均值之和与360°较差不能超过4''" />
</merge>

@ -15,8 +15,8 @@
android:orientation="vertical"
android:paddingHorizontal="16dp"
app:name="左右角测量"
app:offText="左右角平均值之和与360°较差不能超过4"
app:offText="左右角平均值之和与360°较差不能超过4''"
app:onChecked="false"
app:onText="左右角平均值之和与360°较差不能超过4" />
app:onText="左右角平均值之和与360°较差不能超过4''" />
</merge>

@ -90,7 +90,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:layout_marginTop="12dp"
android:text="三角导线联系测量"
android:text="三角导线"
android:textColor="@color/black"
android:textSize="@dimen/text_size_config_title"
android:textStyle="bold" />

@ -3,9 +3,9 @@
<changelogversion
changeDate="2022/8/6"
versionName="0.8.0">
<changelogtext>[b]新增[/b]因为安卓系统存储机制的调整,根目录下的【导线助手】文件夹将停用,软件数据迁移至私有目录,
<changelogtext>[b]新增[/b]因为安卓系统存储机制的调整,根目录下的【控制测量电子手薄】文件夹将停用,软件数据迁移至私有目录,
当用户卸载应用后,软件数据将被删除。请在卸载前点击【数据备份】,备份软件数据,重装软件后可通过【数据导入】来找回数据。
导出路径(根目录-【导线助手导出文件】)保持不变。
导出路径(根目录-【控制测量电子手薄导出文件】)保持不变。
</changelogtext>
</changelogversion>
<changelogversion

@ -13,4 +13,6 @@
<string name="notice_list_left_swipe_edit_delete">注:列表左滑编辑、删除</string>
<string name="notice_list_left_swipe_delete">注:列表左滑删除</string>
<string name="total_station_online">全站仪联机</string>
<string name="back_up_data_tips">当前应用所有数据将被收集到一个zip压缩包中,方便日后恢复。该备份文件将被放置到系统下载目录中,命名格式为「控制测量电子手簿数据+日期.zip」。\n点击下面按钮,就会开始数据备份。</string>
</resources>

@ -13,5 +13,6 @@
<string name="notice_list_left_swipe_edit_delete">Note: Swipe left on the list to delete it</string>
<string name="notice_list_left_swipe_delete">Note: Swipe left on the list to delete it</string>
<string name="total_station_online">Total station online</string>
<string name="back_up_data_tips">All data of the current application will be collected into a zip archive for easy recovery in the future. The backup file will be placed in the system download directory, and the naming format is "control measurement electronic handbook data + date.zip". \nClick the button below to start data backup.</string>
</resources>

@ -48,12 +48,12 @@
android:summaryOff="@string/switch_lean_all_unknown_point"
android:summaryOn="@string/switch_lean_all_point"
android:title="@string/switch_is_completed_lean" />
<androidx.preference.SwitchPreferenceCompat
android:defaultValue="false"
android:key="key_is_abandon_point"
android:summaryOff="@string/switch_abandon_not"
android:summaryOn="@string/switch_abandon"
android:title="@string/switch_abandon_desc" />
<!-- <androidx.preference.SwitchPreferenceCompat-->
<!-- android:defaultValue="false"-->
<!-- android:key="key_is_abandon_point"-->
<!-- android:summaryOff="@string/switch_abandon_not"-->
<!-- android:summaryOn="@string/switch_abandon"-->
<!-- android:title="@string/switch_abandon_desc" />-->
<androidx.preference.SwitchPreferenceCompat
android:key="key_is_open_atr"
android:summaryOff="@string/switch_close_atr"

@ -1,10 +1,13 @@
buildscript {
repositories {
mavenCentral()
google()
// jcenter()
// mavenCentral()
maven { url 'https://maven.aliyun.com/repository/public' }//central仓和jcenter仓的聚合仓
maven { url 'https://maven.aliyun.com/repository/google' } //google()
maven { url 'https://jitpack.io' }
maven { url 'https://oss.sonatype.org/content/groups/public/' }
maven { url 'https://developer.huawei.com/repo/' }
maven { url "https://jitpack.io" }
google()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.9.10"
@ -16,11 +19,13 @@ buildscript {
allprojects {
repositories {
flatDir { dirs 'libs' }
mavenCentral()
google()
// jcenter()
// mavenCentral()
maven { url 'https://maven.aliyun.com/repository/public' }//central仓和jcenter仓的聚合仓
maven { url 'https://maven.aliyun.com/repository/google' } //google()
maven { url 'https://jitpack.io' }
maven { url 'https://oss.sonatype.org/content/groups/public/' }
maven { url 'https://developer.huawei.com/repo/' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
google()
}
}

@ -7,27 +7,43 @@ import java.util.*
class ModuleName(project: Project) {
private val useAAR: String
private val useBaseAAR: String
private val useDeviceAAR: String
init {
val properties = ConfigProperties(project)
useAAR = properties.getProperty("useAAR") ?: "true"
useBaseAAR = properties.getProperty("useBaseAAR") ?: "true"
useDeviceAAR = properties.getProperty("useDeviceAAR") ?: "true"
}
fun bingceModule(name: String): String {
return if ("base" == name) {
if ("false" == useBaseAAR) {
":bingce:base"
if (listOf(
"base"
).contains(name)
) {
return if ("false" == useBaseAAR) {
":bingce:${name}"
} else {
":aar:base"
":aar:${name}"
}
} else {
if ("false" == useAAR) {
":bingce:$name"
}
if (listOf(
"level", "rtk", "totalstation"
).contains(name)
) {
return if ("false" == useDeviceAAR) {
":bingce:${name}"
} else {
":aar:$name"
":aar:${name}"
}
}
return if ("false" == useAAR) {
":bingce:$name"
} else {
":aar:$name"
}
}
fun openSourceModule(name: String): String {

@ -211,6 +211,7 @@ object Libs {
const val agentWeb = "com.just.agentweb:agentweb:4.1.2"//网页加载工具
const val tencentSonic = "com.tencent.sonic:sdk:2.0.0"//腾讯网页加载工具
const val downloader = "com.download.library:Downloader:4.1.2"//下载工具
const val filedownloader = "com.liulishuo.filedownloader:library:1.7.7"
const val keyboardVisibility =
"net.yslibrary.keyboardvisibilityevent:keyboardvisibilityevent:2.3.0"//软件盘监听工具
const val progressBar = "com.daimajia.numberprogressbar:library:1.4@aar"//进度条

@ -1 +1 @@
Subproject commit edf00a6ca7b5afe3a544292bf320eea526d2b511
Subproject commit 17c41fefdecef36e54da06af009dad14c35fba2a

@ -51,12 +51,23 @@ static def bingceModule(ProjectDescriptor rootProject, String name) {
def properties = properties(rootProject)
def useAAR = properties.getProperty('useAAR')
def useBaseAAR = properties.getProperty('useBaseAAR')
if ("base" == name) {
if ("false" == useBaseAAR && "false" == useAAR) {
return ":bingce:base"
def useDeviceAAR = properties.getProperty('useDeviceAAR')
if (Arrays.asList(
"base"
).contains(name)) {
if ("false" == useBaseAAR) {
return ":bingce:$name"
} else {
return ":aar:$name"
}
}
if (Arrays.asList(
"level", "rtk", "totalstation"
).contains(name)) {
if ("false" == useDeviceAAR) {
return ":bingce:$name"
} else {
return ":aar:base"
return ":aar:$name"
}
}
if ("false" == useAAR) {
@ -80,7 +91,13 @@ static def openSourceModule(ProjectDescriptor rootProject, String name) {
static def includeBingceModule(Settings settings, ProjectDescriptor rootProject, String bcDir, String name) {
def moduleName = bingceModule(rootProject, name)
settings.include(moduleName)
if (moduleName == ":aar:base") return // base projectDir
println(moduleName)
if (Arrays.asList(
"base",
"level",
"rtk",
"totalstation"
).contains(name)) return // base projectDir
settings.project(moduleName).projectDir = new File(bcDir, "bingce/$name")
}
@ -110,6 +127,7 @@ includeBingceModule(settings, rootProject, bcDir, "level")
includeBingceModule(settings, rootProject, bcDir, "bc-dialog")
includeBingceModule(settings, rootProject, bcDir, "DialogXInterface")
includeBingceModule(settings, rootProject, bcDir, "bcdialog-style")
includeBingceModule(settings, rootProject, bcDir, "surveyorBase")
includeOpenSourceModule(settings, rootProject, bcDir, "hellocharts")
@ -134,6 +152,8 @@ includeOpenSourceModule(settings, rootProject, bcDir, "socket-usbSerialForAndroi
includeOpenSourceModule(settings, rootProject, bcDir, "usbSerialForAndroid")
includeOpenSourceModule(settings, rootProject, bcDir, "menuItemBadge")
includeOpenSourceModule(settings, rootProject, bcDir, "triangle-library")
includeOpenSourceModule(settings, rootProject, bcDir, "jxls-poi")
includeOpenSourceModule(settings, rootProject, bcDir, "jxls")
includeSdkModule(settings, rootProject, bcDir, "jama")
includeSdkModule(settings, rootProject, bcDir, "libqxwz-sdkcore")

Loading…
Cancel
Save