Skip to content

Commit d6618cd

Browse files
authored
Add Strava OAuth callback and privacy disclosures (#37)
1 parent 04cae54 commit d6618cd

5 files changed

Lines changed: 231 additions & 42 deletions

File tree

‎public/.well-known/assetlinks.json‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
{
3+
"relation": ["delegate_permission/common.handle_all_urls"],
4+
"target": {
5+
"namespace": "android_app",
6+
"package_name": "br.com.helpdev.velocimetroalerta.v2",
7+
"sha256_cert_fingerprints": [
8+
"FE:0E:92:C0:E8:6B:9F:7E:62:90:58:49:D6:33:33:24:E8:29:F6:88:44:F4:35:3C:D4:99:6A:6B:7D:94:95:B6"
9+
]
10+
}
11+
}
12+
]

‎src/app/apps/velocimetro-alerta/privacidade/page.tsx‎

Lines changed: 137 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const metadata: Metadata = {
1313
},
1414
};
1515

16-
const updatedAt = '26 de outubro de 2026';
16+
const updatedAt = '27 de outubro de 2026';
1717

1818
export default function VelocimetroAlertaPrivacyPolicyPage() {
1919
return (
@@ -36,7 +36,8 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
3636
<p>
3737
Esta política se aplica ao aplicativo gratuito Velocímetro Alerta para Android, publicado com o
3838
identificador <code className="break-all rounded bg-gray-100 px-1">br.com.helpdev.velocimetroalerta.v2</code>.
39-
O aplicativo não exige criação de conta e não oferece compras ou assinaturas dentro do app.
39+
Os recursos locais podem ser usados sem conta. Uma conta Google é necessária para sincronizar algumas
40+
preferências ou conectar o Strava. O aplicativo não oferece compras ou assinaturas dentro do app.
4041
</p>
4142
</section>
4243

@@ -50,9 +51,9 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
5051
</p>
5152
<p className="mt-3">
5253
A localização e as métricas da atividade são processadas no dispositivo. A Help DEV não recebe esses
53-
dados em seus servidores, não mantém uma conta de usuário para o app e o app não mantém um histórico
54-
remoto das atividades. Os dados enviados ao Google Maps SDK ao exibir um mapa estão descritos na seção
55-
abaixo. A permissão de localização é necessária para os recursos de velocidade e
54+
dados no Firebase. Se você optar por enviar uma atividade ao Strava, os dados do arquivo GPX seguem
55+
diretamente do aparelho para o Strava, conforme descrito abaixo. Os dados enviados ao Google Maps SDK ao
56+
exibir um mapa estão descritos na seção abaixo. A permissão de localização é necessária para os recursos de velocidade e
5657
rastreamento; você pode recusá-la ou revogá-la nas configurações do Android, mas esses recursos podem
5758
deixar de funcionar.
5859
</p>
@@ -93,16 +94,31 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
9394
</section>
9495

9596
<section>
96-
<h2 className="mb-3 text-xl font-semibold text-gray-900">Preferências e armazenamento</h2>
97+
<h2 className="mb-3 text-xl font-semibold text-gray-900">Conta Google, Firebase e preferências</h2>
9798
<p>
98-
Preferências do app, como limites de velocidade, alertas, sensores configurados e zonas de frequência
99-
cardíaca, ficam no armazenamento local do aplicativo. Conforme as configurações do aparelho e da conta,
100-
o Android pode incluir dados locais do app em um backup ou transferi-los para outro dispositivo. Esses
101-
backups são administrados pelo Android e pelo serviço de backup escolhido; a Help DEV não os controla.
99+
O login Google é opcional para o uso local e necessário para sincronizar preferências e conectar o
100+
Strava. Quando você entra, o Firebase Authentication processa identificadores da conta e informações de
101+
perfil disponibilizadas pelo Google, como nome e e-mail. O Firebase Authentication opera em centros de
102+
dados nos Estados Unidos. O Google trata esses dados conforme sua{' '}
103+
<a className="text-blue-700 underline hover:text-blue-900" href="https://policies.google.com/privacy?hl=pt-BR">
104+
Política de Privacidade
105+
</a>.
106+
</p>
107+
<p className="mt-3">
108+
Se você escolher sincronizar, um conjunto limitado de preferências — incluindo opções de alertas,
109+
intervalos, zonas de frequência cardíaca e a opção de sincronização automática — fica associado à sua
110+
conta no Cloud Firestore do Firebase. O banco e as Cloud Functions do projeto estão configurados na
111+
região de São Paulo; outros dados de serviço do Firebase podem ser processados pela infraestrutura global
112+
do Google. As atividades salvas, arquivos GPX e estados de envio continuam no aparelho e não são enviados
113+
ao Firebase. Mais informações estão na página de{' '}
114+
<a className="text-blue-700 underline hover:text-blue-900" href="https://firebase.google.com/support/privacy">
115+
privacidade e segurança do Firebase
116+
</a>.
102117
</p>
103118
<p className="mt-3">
104-
O app não envia automaticamente localização, métricas de atividade ou preferências para um servidor e não
105-
mantém um serviço próprio de histórico de atividades.
119+
Preferências e atividades locais permanecem no armazenamento do aplicativo. Conforme as configurações do
120+
aparelho e da conta, o Android pode incluí-las em um backup ou transferi-las para outro dispositivo; esses
121+
backups são administrados pelo Android e pelo serviço de backup escolhido.
106122
</p>
107123
</section>
108124

@@ -122,6 +138,28 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
122138
</p>
123139
</section>
124140

141+
<section>
142+
<h2 className="mb-3 text-xl font-semibold text-gray-900">Conexão e envio de atividades ao Strava</h2>
143+
<p>
144+
Para conectar uma conta, você autoriza o Strava pelo navegador com a permissão de criar atividades
145+
(<code>activity:write</code>). O código temporário de autorização é processado pelas Cloud Functions; os
146+
tokens de acesso e renovação ficam no Firestore em um registro privado da sua conta. Quando a integração
147+
estiver ativa, o segredo do aplicativo Strava fica no Google Secret Manager. Para enviar uma atividade, a função devolve ao aparelho
148+
um token de acesso de curta duração, usado para enviar o GPX diretamente à API do Strava. A Help DEV não
149+
recebe o arquivo GPX nem as coordenadas da atividade pelo Firebase.
150+
</p>
151+
<p className="mt-3">
152+
O envio manual transmite a atividade escolhida nos detalhes. Se você ativar <strong>Sincronizar
153+
automático</strong>, atividades elegíveis salvas depois dessa escolha podem ser enviadas automaticamente;
154+
atividades antigas não são enviadas em lote. O GPX pode conter trajeto, coordenadas, horários, elevação e,
155+
quando disponíveis, frequência cardíaca, cadência, temperatura e umidade. O app também envia o nome, o
156+
tipo e um identificador do arquivo. O Strava processa e armazena esses dados de acordo com a{' '}
157+
<a className="text-blue-700 underline hover:text-blue-900" href="https://www.strava.com/legal/privacy?hl=pt-BR">
158+
Política de Privacidade do Strava
159+
</a>.
160+
</p>
161+
</section>
162+
125163
<section>
126164
<h2 className="mb-3 text-xl font-semibold text-gray-900">Anúncios, análise e identificadores</h2>
127165
<p>
@@ -162,13 +200,27 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
162200
</p>
163201
</section>
164202

165-
<section>
166-
<h2 className="mb-3 text-xl font-semibold text-gray-900">Retenção e exclusão</h2>
203+
<section id="exclusao-conta">
204+
<h2 className="mb-3 text-xl font-semibold text-gray-900">Retenção e exclusão de dados</h2>
167205
<p>
168206
As preferências, atividades salvas e rotas permanecem no dispositivo até você excluí-las em Minhas
169-
atividades, limpar os dados do app nas configurações do Android ou desinstalá-lo. A Help DEV não mantém
170-
um histórico remoto dessas atividades. Arquivos GPX exportados e cópias em backups devem ser excluídos
171-
por você no serviço ou dispositivo em que foram salvos, conforme as opções desse destino.
207+
atividades, limpar os dados do app nas configurações do Android ou desinstalá-lo. Preferências sincronizadas
208+
ficam no Firestore enquanto o registro da conta existir; sair da conta Google no app não as exclui.
209+
Quando a desconexão do Strava é concluída pelo app, a autorização é revogada e os tokens armazenados são
210+
removidos. Atividades já enviadas ficam na conta Strava e devem ser excluídas por você diretamente no
211+
Strava. Arquivos GPX exportados e cópias em backups devem ser excluídos no serviço ou dispositivo onde
212+
foram salvos.
213+
</p>
214+
<p className="mt-3">
215+
Para solicitar a exclusão da conta Firebase usada pelo aplicativo, das preferências na nuvem e dos tokens
216+
Strava associados, use o{' '}
217+
<a className="text-blue-700 underline hover:text-blue-900" href="mailto:gbzarelli@gmail.com?subject=Exclus%C3%A3o%20de%20conta%20-%20Veloc%C3%ADmetro%20Alerta">
218+
e-mail de suporte da Help DEV
219+
</a>{' '}
220+
e informe o e-mail da conta Google usada no app. A solicitação remove a autorização e os tokens Strava
221+
armazenados, mas não remove atividades já enviadas à sua conta
222+
Strava nem os arquivos GPX que continuam no dispositivo; esses itens devem ser removidos nos respectivos
223+
serviços ou no app.
172224
</p>
173225
</section>
174226

@@ -193,7 +245,8 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
193245
<p>
194246
This policy applies to the free Velocímetro Alerta Android app, package
195247
<code className="break-all rounded bg-gray-100 px-1">br.com.helpdev.velocimetroalerta.v2</code>.
196-
The app does not require an account and does not offer in-app purchases or subscriptions.
248+
Local features can be used without an account. A Google account is required to sync some preferences or
249+
connect Strava. The app does not offer in-app purchases or subscriptions.
197250
</p>
198251
</section>
199252

@@ -206,11 +259,11 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
206259
settings. The app does not start tracking automatically.
207260
</p>
208261
<p className="mt-3">
209-
Location and activity metrics are processed on your device. Help DEV does not receive this data on its
210-
servers, the app does not require a user account, and the app does not keep a remote activity history.
211-
Data sent to the Google Maps SDK when a map is shown is described below. Location access is required for
212-
speed and tracking features; you can deny or revoke it in Android settings, but those features may stop
213-
working.
262+
Location and activity metrics are processed on your device. Help DEV does not receive them through
263+
Firebase. If you choose to send an activity to Strava, the GPX file goes directly from your device to
264+
Strava, as described below. Data sent to the Google Maps SDK when a map is shown is described below.
265+
Location access is required for speed and tracking features; you can deny or revoke it in Android
266+
settings, but those features may stop working.
214267
</p>
215268
</section>
216269

@@ -247,16 +300,30 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
247300
</section>
248301

249302
<section>
250-
<h3 className="mb-3 text-xl font-semibold text-gray-900">Preferences and storage</h3>
303+
<h3 className="mb-3 text-xl font-semibold text-gray-900">Google account, Firebase, and preferences</h3>
251304
<p>
252-
App preferences, including speed limits, alerts, configured sensors, and heart-rate zones, are stored
253-
locally by the app. Depending on your device and account settings, Android may include local app data in a
254-
backup or transfer it to another device. Android and the backup service you choose manage those backups;
255-
Help DEV does not control them.
305+
Google sign-in is optional for local use and required to sync preferences and connect Strava. When you
306+
sign in, Firebase Authentication processes account identifiers and profile information made available by
307+
Google, such as your name and email address. Firebase Authentication operates from data centers in the
308+
United States. Google handles this data under its{' '}
309+
<a className="text-blue-700 underline hover:text-blue-900" href="https://policies.google.com/privacy?hl=en">
310+
Privacy Policy
311+
</a>.
312+
</p>
313+
<p className="mt-3">
314+
If you choose to sync, a limited set of preferences — including alert options, intervals, heart-rate
315+
zones, and the automatic-sync setting — is associated with your account in Firebase Cloud Firestore. The
316+
database and Cloud Functions are configured in the São Paulo region; other Firebase service data may be
317+
processed across Google’s global infrastructure. Saved activities, GPX files, and upload statuses remain
318+
on your device and are not sent to Firebase. See Firebase’s{' '}
319+
<a className="text-blue-700 underline hover:text-blue-900" href="https://firebase.google.com/support/privacy">
320+
privacy and security information
321+
</a>.
256322
</p>
257323
<p className="mt-3">
258-
The app does not automatically send location, activity metrics, or preferences to a server and does not
259-
maintain its own remote activity-history service.
324+
Preferences and activities remain in the app’s local storage. Depending on your device and account
325+
settings, Android may include them in a backup or transfer them to another device; Android and the backup
326+
service you choose manage those backups.
260327
</p>
261328
</section>
262329

@@ -275,6 +342,28 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
275342
</p>
276343
</section>
277344

345+
<section>
346+
<h3 className="mb-3 text-xl font-semibold text-gray-900">Strava connection and activity uploads</h3>
347+
<p>
348+
To connect an account, you authorize Strava in a browser with permission to create activities
349+
(<code>activity:write</code>). Cloud Functions process the temporary authorization code; access and
350+
refresh tokens are stored in a private Firestore record for your account. When the integration is active,
351+
the Strava application secret is held in Google Secret Manager. When an activity is sent, a function returns a short-lived access token
352+
to the device, which uploads the GPX directly to Strava’s API. Help DEV does not receive the GPX file or
353+
activity coordinates through Firebase.
354+
</p>
355+
<p className="mt-3">
356+
A manual upload sends the activity selected in its details. If you turn on <strong>Automatic sync</strong>,
357+
eligible activities saved after you opt in may be uploaded automatically; existing activities are not
358+
uploaded in a batch. A GPX file may contain the route, coordinates, timestamps, elevation, and, when
359+
available, heart rate, cadence, temperature, and humidity. The app also sends the activity name, type, and
360+
a file identifier. Strava processes and stores this data under its{' '}
361+
<a className="text-blue-700 underline hover:text-blue-900" href="https://www.strava.com/legal/privacy?hl=en-US">
362+
Privacy Policy
363+
</a>.
364+
</p>
365+
</section>
366+
278367
<section>
279368
<h3 className="mb-3 text-xl font-semibold text-gray-900">Ads, analytics, and identifiers</h3>
280369
<p>
@@ -311,13 +400,26 @@ export default function VelocimetroAlertaPrivacyPolicyPage() {
311400
</p>
312401
</section>
313402

314-
<section>
315-
<h3 className="mb-3 text-xl font-semibold text-gray-900">Retention and deletion</h3>
403+
<section id="account-deletion">
404+
<h3 className="mb-3 text-xl font-semibold text-gray-900">Data retention and deletion</h3>
316405
<p>
317406
Preferences, saved activities, and routes remain on your device until you delete them in My activities,
318-
clear the app&apos;s data in Android settings, or uninstall the app. Help DEV does not keep a remote history
319-
of these activities. You are responsible for deleting exported GPX files and backup copies from the
320-
service or device where they were saved, using that destination&apos;s available options.
407+
clear the app&apos;s data in Android settings, or uninstall the app. Synced preferences remain in Firestore
408+
while the account record exists; signing out of Google in the app does not delete them. When you
409+
disconnect Strava in the app, its authorization is revoked and stored tokens are removed. Activities
410+
already uploaded remain in your Strava account and must be deleted there. Delete exported GPX files and
411+
backup copies in the service or device where they were saved.
412+
</p>
413+
<p className="mt-3">
414+
To request deletion of the Firebase account used by the app, its cloud preferences, and associated Strava
415+
tokens, use Help DEV&apos;s{' '}
416+
<a className="text-blue-700 underline hover:text-blue-900" href="mailto:gbzarelli@gmail.com?subject=Account%20deletion%20-%20Veloc%C3%ADmetro%20Alerta">
417+
support email
418+
</a>{' '}
419+
and include the email address of the Google account used in the app. The request removes the stored Strava
420+
authorization and tokens, but it does not remove
421+
activities already uploaded to your Strava account or GPX files that remain on your device; remove those
422+
items in their respective services or in the app.
321423
</p>
322424
</section>
323425

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { Metadata } from 'next';
2+
import StravaCallbackFallback from './strava-callback-fallback';
3+
4+
export const metadata: Metadata = {
5+
title: 'Retorno do Strava — Velocímetro Alerta',
6+
robots: { index: false, follow: false },
7+
};
8+
9+
export default function StravaCallbackPage() {
10+
return <StravaCallbackFallback />;
11+
}

0 commit comments

Comments
 (0)