NDT Events App Privacy Policy

1.0 Our core beliefs regarding user privacy and data protection

  • User privacy and data protection are human rights
  • We have a duty of care to the people within our data
  • Data is a liability, it should only be collected and processed when absolutely necessary
  • We loathe spam as much as you do!
  • We will never sell, rent or otherwise distribute or make public your personal information

2.0 Relevant legislation

Along with our business and internal computer systems, the named app & the corresponding infrastructure is designed to comply with the following national and international legislation with regards to data protection and user privacy:

The NDT Events app compliance with the above legislation, all of which are stringent in nature, means that the app is likely compliant with the data protection and user privacy legislation set out by many other countries and territories as well. If you are unsure about whether the app is compliant with your own country of residences’ specific data protection and user privacy legislation you should contact our data protection officer (details of whom can be found in section 9.0) for clarification.

3.0 Personal information that the app collects and why we collect it

The NDT Events app collects and uses personal information for the following reasons:

3.1 IP address logging

When the app on your device connects to our server to upload or download content, your device’s IP address (which could be used to personally identify you) is logged by our server.

3.2 Your account

Should you choose to create an account in the app, the email address and password you enter to create your account will be saved to our server’s database. This information is only used by us to identify you when you access your customised schedule. Items you choose to add to your schedule are saved so you can login and view them on multiple devices, or restore them should you re-install the app.

Your account and its associated personal data will remain in our database unless we identify a reason to remove the account. Should you wish to have your account and its associated personal data deleted, please use this form to request your data be deleted.

3.3 Feedback

Should you opt to send us feedback using the mechanism offered within the app, you have the choice to enter your email address. If you do choose to enter your email address this will be saved to our server’s database. This information will only be used by members of our staff to respond to your feedback.

Your feedback will remain in our database until we have liaised further with you about your specific comments (should it be deemed necessary and you have supplied an email address for us to correspond with you). Should you wish to have your feedback deleted sooner than we would usually do so, please email us here using the email address that you signed up with.

3.4 Crash reporting

If you opt-in to allow sending of crash reports, if the app crashes, some data about your device is sent to the provider of this service, Firebase Crashlytics

This data is used by us to try and ascertain why the app on your device crashed. Collecting this data helps us identify recurring problems that need to be fixed in future app updates.

Full details of data collected can be found here. Below is a typical example of the type of data that is sent from your device:

  Value
Date of crash 07/08/2023 09:12:53 AM
App Name NDT Events
App Version 2024.08 (27)
Device OS Version Android 14
Device Model Huawei Y9 2018
Device RAM free 739.64 MB
Device Disk Space 4.47 GB
Device Orientation Landscape
Rooted No
App running in background No
Class/Module Name ScheduleListFragment.java
Line Number 177
Method ScheduleListFragment.removeDefaultMessage
Crash Stack Trace
Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'androidx.fragment.app.FragmentManager androidx.fragment.app.Fragment.mFragmentManager' on a null object reference in method 'androidx.fragment.app.FragmentTransaction androidx.fragment.app.BackStackRecord.remove(androidx.fragment.app.Fragment)'
      at androidx.fragment.app.BackStackRecord.remove(BackStackRecord.java:202)
      at org.bindt.ndtevents.schedule.ScheduleListFragment.removeDefaultMessage(ScheduleListFragment.java:177)
      at org.bindt.ndtevents.schedule.ScheduleListFragment.loadScheduleDetail(ScheduleListFragment.java:152)
      at org.bindt.ndtevents.schedule.ScheduleListFragment.onResume(ScheduleListFragment.java:216)
      at androidx.fragment.app.Fragment.performResume(Fragment.java:3180)
      at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:606)
      at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:285)
      at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1899)
      at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1817)
      at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1729)
      at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:317)
      at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer.updateFragmentMaxLifecycle(FragmentStateAdapter.java:747)
      at androidx.viewpager2.adapter.FragmentStateAdapter$FragmentMaxLifecycleEnforcer$1.onPageScrollStateChanged(FragmentStateAdapter.java:648)
      at androidx.viewpager2.widget.CompositeOnPageChangeCallback.onPageScrollStateChanged(CompositeOnPageChangeCallback.java:87)
      at androidx.viewpager2.widget.CompositeOnPageChangeCallback.onPageScrollStateChanged(CompositeOnPageChangeCallback.java:87)
      at androidx.viewpager2.widget.ScrollEventAdapter.dispatchStateChanged(ScrollEventAdapter.java:425)
      at androidx.viewpager2.widget.ScrollEventAdapter.onScrolled(ScrollEventAdapter.java:213)
      at androidx.recyclerview.widget.RecyclerView.dispatchOnScrolled(RecyclerView.java:5688)
      at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5871)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1339)
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1348)
      at android.view.Choreographer.doCallbacks(Choreographer.java:952)
      at android.view.Choreographer.doFrame(Choreographer.java:878)
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1322)
      at android.os.Handler.handleCallback(Handler.java:958)
      at android.os.Handler.dispatchMessage(Handler.java:99)
      at android.os.Looper.loopOnce(Looper.java:205)
      at android.os.Looper.loop(Looper.java:294)
      at android.app.ActivityThread.main(ActivityThread.java:8177)
      at java.lang.reflect.Method.invoke(Method.java)
      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
											

Please note: the transfer of information about crashes and malfunctions to the Crashlytics service is optional and can be enabled or disabled at any time from within the app settings.

4.0 How we store your personal information

As detailed in section 3.1 above, if you use the app some personal information will be stored within our server logs. Your IP Address will be stored in a plain text format until the end of the current day (up to a 24-hour period) and, under normal circumstances, can only be accessed by our server operators who have the highest system privileges. At the end of each day the server logs are encrypted, these encrypted logs are retained for a further 30 days before being anonymised. The anonymisation process alters any personally identifiable information to the point where it cannot be linked back to you as an individual.

If you chose to create an account then your details (as described in section 3.2) will be stored within our database, copies of this database are created for backup purposes, each backup is encrypted for safe archival for a period of up to 365 days.

If you chose to supply your email address when submitting feedback (as described in section 3.3) your address and feedback will be stored within our database, copies of this database are created for backup purposes, each backup is encrypted for safe archival for a period of up to 365 days.

The data collected in section 3.4 is sent directly to the provider of this service, Firebase Crashlytics. Some of the data is copied to an offline spreadsheet which is used to identify repeat crashes in the same module/method.

5.0 About this app’s server

The server providing the supporting infrastructure for the NDT Events app is hosted by Digital Ocean within their London, UK region.

DigitalOcean's infrastructure is continually maintained following internationally recognised security controls. Their infrastructure is monitored 24/7/365 and undergoes third-party audits as well as targeted testing annually. For physical security, each of their data centre colocation providers maintain industry-recognized certifications and it's networks are MANRS certified.

All traffic (transferral of files/data) between the server and the app is encrypted and delivered over HTTPS.

6.0 Our third-party data processors

We use a number of third parties to process personal data on our behalf. These third parties have been carefully chosen and comply with the legislation set out in section 2.0.

7.0 Data breaches

We will report any unlawful data breach of this app’s database or the database(s) of any of our third-party data processors to any and all relevant persons and authorities within 72 hours of the breach if it is apparent that personal data stored in an identifiable manner has been stolen.

8.0 Data controller

The data controller for this app is: The British Institute of Non-Destructive Testing Limited, a UK Private Limited Company with company number: 969051

Whose registered office is:
  Midsummer House,
  Riverside Way,
  Bedford Road,
  Northampton .
  NN1 5NX

9.0 Data Protection Officer

Alicia Carroll
Quality Officer, The British Institute of Non-Destructive Testing Ltd.
Telephone: 01604 438300
Email: [email protected]

10.0 Changes to our privacy policy

This privacy policy may change from time to time in line with legislation or industry developments. We will not explicitly inform our clients or app users of these changes. Instead, we recommend that you check this page occasionally for any policy changes. Specific policy changes and updates are mentioned in the change log below.

10.1 Change log

14/11/2018

  • Privacy policy instigated

14/08/2024

  • Removed references to the unique Device ID which is no longer transmitted nor stored (since app version 2024.08)
  • Added information about crash reporting and what is contained within a report
  • Server logs are now anonymised (rather than deleted) after 30 days
  • Server backups are now stored for up to 365 days (an increase from 7 days)
  • Updated server details to reflect new hosting company
  • Updated Data Protection Officer details