Automatización en Android

Wei-Yu

Creo que no hay ningún hilo similar, así que empiezo compartiendo mi experiencia a ver cuánta gente ha estado tocando cosas chulas.

Automatización en Android abarca muchas cosas. La gente suele utilizar apps como Tasker o MacroDroid, aunque son bienvenidas experiencias con otras apps o formas de automatizar cosas en android, claro.


Y ahora mi libro. Empecé automatizando cosas un poco más "en serio" porque quería tener las apps del curro (ej: el email, teams o slack) instaladas en el móvil pero no quería que me molestasen constantemente ni fuera de hora. Así que tiré de un par de apps para simplificar el flujo de trabajar, descansar y una forma de cambiarlo todo según paso por fines de semana y vacaciones.

Con macrodroid y buzzkill me hice lo siguiente:

Primero los 2 modos que controlan todo; work y vacation.

El modo trabajo se activa si no estoy de vacaciones. Empieza a una hora determinada por la mañana con una notificación persistente que me deja activar/desactivar las notificaciones de las apps de trabajo gracias a una regla de buzzkill:

Esto es super útil cuando, por el motivo que sea, no quiero/puedo estar en el portátil pero sigo queriendo estar disponible. Y a la vez me evito estar currando y que el móvil vibre constantemente con mensajes, porque puedo desactivar/activar las notificaciones desde la notificación persistente.

Cuando ya me toca cerrar el día, se descarta la notificación persistente y se activa la regla de buzzkill para que no me llegue ningún mensaje del curro. Hay más cosas aparte (ej me salta una notificación 15 minutos antes para ir organizando cerrar el día de hoy + organizar para la primera hora de mañana), pero esto es lo que tiene más magia:

Esto sólo ocurre si no estoy de vacaciones. Para controlar las vacaciones, utilizo un calendario en google. Si entro o salgo de un evento de vacaciones, se activa/desactiva el modo vacaciones y además me cambio las alarmas del móvil a través de un intent de sleep as android, para no tener que tocar las alarmas yo manualmente.

Esto es lo que se ejecuta cuando se me acaban las vacaciones:

# enable work alarm
am broadcast --user 0 -p com.urbandroid.sleep -a com.urbandroid.sleep.alarmclock.ALARM_STATE_CHANGE --es alarm_label Work --ez alarm_enabled TRUE

# disable vacation alarm
am broadcast --user 0 -p com.urbandroid.sleep -a com.urbandroid.sleep.alarmclock.ALARM_STATE_CHANGE --es alarm_label Vacation --ez alarm_enabled FALSE

(esto en realidad lo encontré en un post de reddit jeje)

Es probable que añada algunas cosas más con el tiempo. Por ejemplo, que si es fin de semana o estoy de vacas y estoy desconectado del wifi de mi casa o conectado al PC por bluetooth, que me autoretrase la alarma 1 hora.

He visto que el tema de los intent y adb tiene bastante truco por no estar bien documentado. Si alguien tiene experiencia con el tema le agradecería mil si pone ejemplos de cosas que ha tocado, porque lo he visto super difícil de investigar... por ejemplo buscando logs relacionados con sleep as android salen muchos logs y muy verbosos todos y no son fáciles de interpretar. Ejemplo:

El comando se traduce más o menos como "busca en el log de adb todas las líneas que contengan urbandroid" (es parte del package name de la app de sleep as android).

6
hda

Me parece muy interesante. Me quedo en este hilo para leerlo con más detenimiento.

Gracias por traer un hilo de calidad :D

16 días después
Wei-Yu

Después de pegarme un rato he añadido un auto start para android auto en base a eventos del calendario y además he limpiado algo la config para que sea más sencilla de seguir.

Tengo estos tres macros:

2 de ellos gestionan una variable global con el destino del viaje y el otro ejecuta la navegación:

1) Set travel destination. Cada 5 min comprueba si hay un evento en determinados calendarios en las próximas 4 horas. Si lo hay y tiene un lugar en las propiedades, se añade el lugar a la variable global.
2) Unset travel destination. Cuando un evento de esos calendarios termina, se vacía la variable global.
3) Android auto nav to event. Si la variable tiene datos y se lanza android auto, se lanza la navegación desde la localización actual hasta la que se encuentra en la variable.

Para la navegación uso la URL api de google maps:

Y ese macro usa este código javascript para limpiar los datos y poder codificarlos en la URL:

// Script uses Google maps URLs
// specification. Refer to
// official documentation for
// more information.
// Uses JSEvaluator engine
// instead of jetpack js
// because the former launches a
// webview, which allows us to
// reach for Web APIs such as
// URLSearchParams.


let baseURL = new URL(
  "https://www.google.com/maps/dir/?"
);

// There are some issues with
// injecting macrodroid
// variables. When there are
// line breaks, script fails
// silently.
let params =
  new URLSearchParams();

params.append("api", 1);

// This param triggers
// navigation in gmaps.
params.append(
  "dir_action", "navigate"
);

params.append(
  "origin",
  "{lv=start location}"
);

params.append(
  "destination",
  "{lv=end location}"
);


// If not present, gmaps
// provides sane defaults.
let travelmode =
  "{lv=travel mode}";
if (travelmode) {
  params.append(
    "travelmode", travelmode
  );
}


baseURL.toString() +
  params.toString();

(el código mide tan poco de ancho porque está escrito desde el móvil)

Funciona bastante guay, me he puesto un timer de 20 segundos cuando se va a lanzar la navegación para que no me atosigue el móvil nada más subirme al coche y es bastante cómodo.

1

Usuarios habituales

  • Wei-Yu
  • hda