¡Misterio resuelto! Ya sabemos por qué ha desaparecido la función ‘hasta la siguiente alarma’ de Android 6.0.1

Ayer os informábamos de que la opción de silenciar el teléfono hasta nueva alarma había desparecido misteriosamente en los terminales con Android 6.0.1 sin previo aviso. Aunque Google no se ha pronunciado oficialmente, parece que ya sabemos cuál es la causa detrás de esta misteriosa desaparición.

Un usuario de Reddit llamado evan1123 ha descubierto que todo se debe a un bug en el código de Android, en concreto en la rutina que comprueba si hay alguna alarma programada en la siguiente semana o, siendo precisos, en los siguientes seis días.

Como se puede ver en el código de Android, los desarrolladores de Google han utilizado incorrectamente el método roll para calcular cuál será la fecha dentro de seis días:

Línea 514: weekRange.roll(Calendar.DATE, 6);

Como podemos leer en la documentación de Java, el método roll añade una cantidad de días a una fecha sin modificar otros campos mayores (mes o año).

roll(int field, int amount): Adds a signed amount to the specified calendar field without changing larger fields.

Esto significa que si aplicas el método roll a Calendar.DATE, los días avanzan pero no así el mes o el año, que permanecen inalterados. Dicho de otra forma, si aplicas roll a la fecha actual, 28 de diciembre, con un valor de 6 días, acabas en el 3 diciembre de 2015 y no en el 3 de enero de 2016.

Por tanto este fallo ocurrirá todos los meses cuando se acerque el final de mes, hasta que sea resuelto por Google. La solución es sencilla, basta con utilizar el método add en lugar de roll ya que add incrementa otros campos (mes, año) si es necesario.

¡Misterio resuelto!