Skip to content

Commit

Permalink
feat: 🎸 add terms and privacy info
Browse files Browse the repository at this point in the history
  • Loading branch information
dpatrongomez committed Dec 30, 2024
1 parent d0683a3 commit bb896cf
Show file tree
Hide file tree
Showing 11 changed files with 316 additions and 3 deletions.
47 changes: 47 additions & 0 deletions assets/md/privacy_policy.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
**Política de Privacidad**

Esta política de privacidad aplica a la aplicación EducamosCLM (en adelante, "la Aplicación") para dispositivos móviles, creada por Daniel Patrón Gómez (en adelante, "el Proveedor del Servicio") como un servicio de código abierto. Este servicio está destinado a usarse "TAL CUAL".

**¿Qué información obtiene la Aplicación y cómo se utiliza?**

La Aplicación no recopila ninguna información cuando la descargas y la utilizas. No se requiere registro para usar la Aplicación.

**¿La Aplicación recopila información precisa en tiempo real sobre la ubicación del dispositivo?**

Esta Aplicación no recopila información precisa sobre la ubicación de tu dispositivo móvil.

**¿Terceros ven y/o tienen acceso a la información obtenida por la Aplicación?**

Dado que la Aplicación no recopila ninguna información, no se comparte ningún dato con terceros.

**¿Cuáles son mis derechos para rechazar?**

Puedes detener toda recopilación de información de la Aplicación fácilmente desinstalándola. Puedes usar los procesos estándar de desinstalación disponibles en tu dispositivo móvil o a través del mercado o red de aplicaciones móviles.

**Niños**

La Aplicación no está diseñada para solicitar datos de manera consciente ni para promocionarse entre niños menores de 13 años.

El Proveedor del Servicio no recopila de manera consciente información personal identificable de niños. El Proveedor del Servicio alienta a todos los niños a no enviar ninguna información personal identificable a través de la Aplicación y/o los Servicios. El Proveedor del Servicio anima a los padres y tutores legales a supervisar el uso de Internet de sus hijos y a ayudar a hacer cumplir esta Política instruyéndoles para que nunca proporcionen información personal identificable a través de la Aplicación y/o los Servicios sin su permiso. Si tienes motivos para creer que un niño ha proporcionado información personal identificable al Proveedor del Servicio a través de la Aplicación y/o los Servicios, por favor, contacta al Proveedor del Servicio ([email protected]) para que pueda tomar las medidas necesarias. Además, debes tener al menos 16 años para consentir el procesamiento de tu información personal en tu país (en algunos países se puede permitir que tus padres o tutores lo hagan en tu nombre).

**Seguridad**

El Proveedor del Servicio se preocupa por salvaguardar la confidencialidad de tu información. Sin embargo, dado que la Aplicación no recopila ninguna información, no existe riesgo de que tus datos sean accedidos por personas no autorizadas.

**Cambios**

Esta Política de Privacidad puede actualizarse ocasionalmente por cualquier motivo. El Proveedor del Servicio te notificará cualquier cambio en su Política de Privacidad actualizando esta página con la nueva Política de Privacidad. Se recomienda consultar esta Política de Privacidad regularmente para verificar cualquier cambio, ya que el uso continuado se considerará como aceptación de todos los cambios.

Esta política de privacidad es efectiva a partir del 30 de diciembre de 2024.

**Tu Consentimiento**

Al usar la Aplicación, estás dando tu consentimiento para el procesamiento de tu información tal como se describe en esta Política de Privacidad, ahora y según sea enmendada por el Proveedor del Servicio.

**Contáctanos**

Si tienes alguna pregunta sobre la privacidad al usar la Aplicación, o preguntas sobre las prácticas, por favor, contacta al Proveedor del Servicio mediante el correo electrónico [email protected].

---

Esta página de política de privacidad fue generada por [App Privacy Policy Generator](https://app-privacy-policy-generator.nisrulz.com/).
37 changes: 37 additions & 0 deletions assets/md/terms_and_conditions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
**Términos y Condiciones**

Estos términos y condiciones aplican a la aplicación EducamosCLM (en adelante, "la Aplicación") para dispositivos móviles, creada por Daniel Patrón Gómez (en adelante, "el Proveedor del Servicio") como un servicio de código abierto.

Al descargar o utilizar la Aplicación, aceptas automáticamente los siguientes términos. Se recomienda encarecidamente que leas y entiendas estos términos antes de usar la Aplicación. Está estrictamente prohibido copiar, modificar la Aplicación, cualquier parte de la Aplicación, o nuestras marcas comerciales sin autorización. No se permiten intentos de extraer el código fuente de la Aplicación, traducirla a otros idiomas o crear versiones derivadas. Todas las marcas comerciales, derechos de autor, derechos de bases de datos y otros derechos de propiedad intelectual relacionados con la Aplicación permanecen como propiedad del Proveedor del Servicio.

El Proveedor del Servicio se compromete a garantizar que la Aplicación sea lo más útil y eficiente posible. Por lo tanto, se reserva el derecho de modificar la Aplicación o cobrar por sus servicios en cualquier momento y por cualquier motivo. El Proveedor del Servicio asegura que cualquier cobro por la Aplicación o sus servicios será comunicado claramente.

La Aplicación almacena y procesa los datos personales que has proporcionado al Proveedor del Servicio con el fin de prestar el servicio. Es tu responsabilidad mantener la seguridad de tu teléfono y el acceso a la Aplicación. El Proveedor del Servicio desaconseja enfáticamente hacer jailbreak o root a tu teléfono, ya que esto elimina las restricciones y limitaciones del sistema operativo oficial de tu dispositivo. Tales acciones podrían exponer tu teléfono a malware, virus, programas maliciosos, comprometer las funciones de seguridad de tu teléfono y provocar que la Aplicación no funcione correctamente o en absoluto.

Ten en cuenta que la Aplicación utiliza servicios de terceros que tienen sus propios Términos y Condiciones. A continuación, se incluyen los enlaces a los Términos y Condiciones de los proveedores de servicios de terceros utilizados por la Aplicación:

- [Google Play Services](https://policies.google.com/terms)

Ten en cuenta que el Proveedor del Servicio no asume responsabilidad por ciertos aspectos. Algunas funciones de la Aplicación requieren una conexión activa a Internet, ya sea por Wi-Fi o proporcionada por tu proveedor de red móvil. El Proveedor del Servicio no se hace responsable si la Aplicación no funciona a plena capacidad debido a la falta de acceso a Wi-Fi o si has agotado tu paquete de datos.

Si utilizas la Aplicación fuera de una zona con Wi-Fi, ten en cuenta que los términos del acuerdo con tu proveedor de red móvil siguen siendo aplicables. En consecuencia, podrías incurrir en cargos de tu proveedor de red móvil por el uso de datos durante la conexión a la Aplicación u otros cargos de terceros. Al usar la Aplicación, aceptas la responsabilidad de dichos cargos, incluidos los cargos por roaming si usas la Aplicación fuera de tu territorio de origen (es decir, región o país) sin desactivar el roaming de datos. Si no eres quien paga la factura del dispositivo en el que usas la Aplicación, se asume que has obtenido el permiso del titular de la factura.

De manera similar, el Proveedor del Servicio no siempre puede asumir responsabilidad por tu uso de la Aplicación. Por ejemplo, es tu responsabilidad asegurarte de que tu dispositivo esté cargado. Si tu dispositivo se queda sin batería y no puedes acceder al servicio, el Proveedor del Servicio no se hace responsable.

En cuanto a la responsabilidad del Proveedor del Servicio por tu uso de la Aplicación, es importante señalar que, aunque se esfuerza por garantizar que esté actualizada y sea precisa en todo momento, depende de terceros para proporcionar información que pueda poner a tu disposición. El Proveedor del Servicio no acepta responsabilidad por ninguna pérdida, directa o indirecta, que experimentes como resultado de confiar completamente en esta funcionalidad de la Aplicación.

El Proveedor del Servicio podría desear actualizar la Aplicación en algún momento. La Aplicación está actualmente disponible según los requisitos del sistema operativo (y para cualquier sistema adicional al que decidan extender la disponibilidad de la Aplicación). Dichos requisitos podrían cambiar, y necesitarás descargar las actualizaciones si deseas continuar usando la Aplicación. El Proveedor del Servicio no garantiza que siempre actualizará la Aplicación para que sea relevante para ti y/o compatible con la versión específica del sistema operativo instalada en tu dispositivo. Sin embargo, aceptas aceptar siempre las actualizaciones de la Aplicación cuando se te ofrezcan. El Proveedor del Servicio también podría cesar la provisión de la Aplicación y puede terminar su uso en cualquier momento sin previo aviso. A menos que se te indique lo contrario, al finalizar la provisión: (a) los derechos y licencias otorgados en estos términos finalizarán; (b) debes dejar de usar la Aplicación y (si es necesario) eliminarla de tu dispositivo.

**Cambios en estos Términos y Condiciones**

El Proveedor del Servicio puede actualizar periódicamente sus Términos y Condiciones. Por lo tanto, se recomienda revisar esta página regularmente para verificar cambios. El Proveedor del Servicio notificará cualquier cambio publicando los nuevos Términos y Condiciones en esta página.

Estos términos y condiciones son efectivos a partir del 30 de diciembre de 2024.

**Contáctanos**

Si tienes preguntas o sugerencias sobre los Términos y Condiciones, no dudes en contactar al Proveedor del Servicio en [email protected].

---

Esta página de Términos y Condiciones fue generada por [App Privacy Policy Generator](https://app-privacy-policy-generator.nisrulz.com/).
38 changes: 38 additions & 0 deletions lib/components/card_with_children.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';

class CardWithChildren extends StatelessWidget {
final List<Widget> children;
final String title;
const CardWithChildren({
super.key,
required this.children,
this.title = 'Title',
});
@override
Widget build(BuildContext context) {
return Card(
elevation: 0.0,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8.0)),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 8.0, top: 8.0),
child: Text(
title,
style: TextStyle(
fontSize: 14,
color: Theme.of(context).colorScheme.primary,
),
),
),
Column(
mainAxisSize: MainAxisSize.min,
children: children,
),
],
),
);
}
}
36 changes: 36 additions & 0 deletions lib/components/custom_list_tile.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import 'package:flutter/material.dart';

class CustomListTile extends StatelessWidget {
final String? title;
final String? subtitle;
final IconData icon;
final VoidCallback onTap;

const CustomListTile({
super.key,
this.title = 'Title',
this.subtitle,
this.icon = Icons.star,
required this.onTap,
});
@override
Widget build(BuildContext context) {
return ListTile(
onTap: onTap,
dense: true,
leading: Icon(
icon,
color: const Color(0xff909090),
),
title: Text(
title!,
style: Theme.of(context).textTheme.bodyLarge,
),
subtitle: subtitle == null
? null
: Text(
subtitle!,
),
);
}
}
12 changes: 9 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'dart:io';
import 'dart:ui';

import 'package:dynamic_color/dynamic_color.dart';
import 'package:educamosclm/pages/settings/pages/privacy_page.dart';
import 'package:educamosclm/pages/settings/pages/terms_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:dynamic_color/dynamic_color.dart';

import 'pages/inappwebview_page.dart';
import 'pages/home_page.dart';
import 'package:educamosclm/pages/home_page.dart';
import 'package:educamosclm/pages/inappwebview_page.dart';
import 'package:educamosclm/pages/settings/settings_page.dart';

Future main() async {
WidgetsFlutterBinding.ensureInitialized();
Expand Down Expand Up @@ -89,6 +92,9 @@ class MyApp extends StatelessWidget {
routes: {
'/': (BuildContext context) => HomePage(),
'webview': (BuildContext context) => InAppWebViewPage(),
'/settings': (BuildContext context) => SettingsPage(),
PrivacyPage.routeName: (context) => const PrivacyPage(),
TermsPage.routeName: (context) => const TermsPage(),
});
});
}
Expand Down
8 changes: 8 additions & 0 deletions lib/pages/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,14 @@ class HomePage extends StatelessWidget {
appBar: AppBar(
title: Text('EducamosCLM'),
centerTitle: true,
actions: [
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
Navigator.pushNamed(context, '/settings');
},
),
],
bottom: TabBar(
indicatorColor: Theme.of(context).colorScheme.secondary,
labelColor: Colors.white,
Expand Down
33 changes: 33 additions & 0 deletions lib/pages/settings/pages/privacy_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart';

class PrivacyPage extends StatelessWidget {
static const routeName = '/privacy';

const PrivacyPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Política de privacidad'),
),
body: Padding(
padding: const EdgeInsets.all(10.0),
child: FutureBuilder(
future:
Future.delayed(const Duration(milliseconds: 150)).then((value) {
return rootBundle.loadString('assets/md/privacy_policy.md');
}),
builder: ((context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Markdown(data: snapshot.data);
}
return const Center(child: CircularProgressIndicator());
}),
),
),
);
}
}
33 changes: 33 additions & 0 deletions lib/pages/settings/pages/terms_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart';

class TermsPage extends StatelessWidget {
static const routeName = '/terms';

const TermsPage({super.key});

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Términos y condiciones'),
),
body: Padding(
padding: const EdgeInsets.all(10.0),
child: FutureBuilder(
future:
Future.delayed(const Duration(milliseconds: 150)).then((value) {
return rootBundle.loadString('assets/md/terms_and_conditions.md');
}),
builder: ((context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Markdown(data: snapshot.data);
}
return const Center(child: CircularProgressIndicator());
}),
),
),
);
}
}
57 changes: 57 additions & 0 deletions lib/pages/settings/settings_page.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:educamosclm/components/card_with_children.dart';
import 'package:educamosclm/components/custom_list_tile.dart';
import 'package:educamosclm/pages/settings/pages/privacy_page.dart';
import 'package:educamosclm/pages/settings/pages/terms_page.dart';

class SettingsPage extends StatefulWidget {
const SettingsPage({super.key});

@override
SettingsPageState createState() => SettingsPageState();
}

class SettingsPageState extends State<SettingsPage> {
@override
void initState() {
super.initState();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Ajustes'),
),
body: ListView(
children: <Widget>[
CardWithChildren(
title: 'Privacidad',
children: <Widget>[
CustomListTile(
title: 'Política de privacidad',
icon: Icons.privacy_tip,
onTap: () {
Navigator.pushNamed(
context,
PrivacyPage.routeName,
);
},
),
CustomListTile(
title: 'Términos y condiciones',
icon: Icons.file_copy,
onTap: () {
Navigator.pushNamed(
context,
TermsPage.routeName,
);
},
),
],
),
],
),
);
}
}
16 changes: 16 additions & 0 deletions pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.0.0"
flutter_markdown:
dependency: "direct main"
description:
name: flutter_markdown
sha256: "255b00afa1a7bad19727da6a7780cf3db6c3c12e68d302d85e0ff1fdf173db9e"
url: "https://pub.dev"
source: hosted
version: "0.7.4+3"
flutter_test:
dependency: "direct dev"
description: flutter
Expand Down Expand Up @@ -256,6 +264,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "5.1.1"
markdown:
dependency: transitive
description:
name: markdown
sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051
url: "https://pub.dev"
source: hosted
version: "7.2.2"
matcher:
dependency: transitive
description:
Expand Down
2 changes: 2 additions & 0 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies:
path_provider: ^2.1.5
permission_handler: ^11.3.1
dynamic_color: ^1.7.0
flutter_markdown: ^0.7.4+3

dev_dependencies:
flutter_test:
Expand All @@ -34,6 +35,7 @@ flutter:
assets:
- assets/img/home/
- assets/img/logo_android.png
- assets/md/

# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware.
Expand Down

0 comments on commit bb896cf

Please sign in to comment.