Cuánto falta para terminar, al ritmo que se lleva #30

Closed
HBB wants to merge 0 commits from HBB:pr/ritmo-lectura into main
First-time contributor

Con la fecha de inicio y lo que se lleva leído sale un ritmo, y con él los días
que quedan. Redondeados hacia arriba: quedando media jornada, la respuesta
honrada es «un día», no «cero».

Sale en la estantería «Leyendo» y en la ficha del libro, y la cuenta va aparte y
con sus pruebas, porque el resultado se enseña en dos sitios y tiene que decir lo
mismo en los dos.

Sin fecha de inicio, recién empezado o a ritmo de tortuga no se enseña nada: una
previsión sacada del aire es peor que ninguna.

En la tarjeta de «Leyendo», una barra a lo ancho del borde de abajo con lo leído
y, centrada justo encima, la previsión. Anotado un progreso nuevo, las dos se
rehacen en el acto con el valor que acaba de mandarse, sin pedirle nada más a la
instancia.

Sacar por dónde va un libro cuesta una petición por libro, y el carrusel deshace
la pantalla al pasar a la pestaña de al lado: cada vuelta las pedía todas otra
vez para llegar al mismo resultado. Ahora se guardan y solo se preguntan los
libros que no se conocen, los de hace más de una hora, o todos con «Actualizar
datos».

Esta rama va encima de pr/estanterias-propias. Es la última de las cinco.

Con la fecha de inicio y lo que se lleva leído sale un ritmo, y con él los días que quedan. Redondeados hacia arriba: quedando media jornada, la respuesta honrada es «un día», no «cero». Sale en la estantería «Leyendo» y en la ficha del libro, y la cuenta va aparte y con sus pruebas, porque el resultado se enseña en dos sitios y tiene que decir lo mismo en los dos. Sin fecha de inicio, recién empezado o a ritmo de tortuga no se enseña nada: una previsión sacada del aire es peor que ninguna. En la tarjeta de «Leyendo», una barra a lo ancho del borde de abajo con lo leído y, centrada justo encima, la previsión. Anotado un progreso nuevo, las dos se rehacen en el acto con el valor que acaba de mandarse, sin pedirle nada más a la instancia. Sacar por dónde va un libro cuesta una petición por libro, y el carrusel deshace la pantalla al pasar a la pestaña de al lado: cada vuelta las pedía todas otra vez para llegar al mismo resultado. Ahora se guardan y solo se preguntan los libros que no se conocen, los de hace más de una hora, o todos con «Actualizar datos». Esta rama va encima de `pr/estanterias-propias`. Es la última de las cinco.
HBB added 28 commits 2026-08-14 21:58:21 +00:00
El formulario de la web manda la fecha del día al cambiar el estado de lectura;
la app no mandaba ninguna, así que la lectura quedaba dada de alta **sin fechas**
y había que escribirlas después a mano, libro por libro. Se manda la que
corresponda al paso que se da: inicio, fin o abandono.
Tocar una fila de la pestaña «Diverse» copia su valor al portapapeles, y
cada una copia lo suyo: con el ISBN, el OCLC y el de Open Library uno
debajo de otro, uno se lleva el que ha tocado y no los tres. La portada
copia el título.

El aviso dice lo que se ha copiado, para no tener que ir a pegarlo para
saberlo, recortado a sesenta letras. Desde Android 13 el sistema enseña
su propia confirmación al copiar y no se puede quitar, así que ahí se
pone el valor a secas —se lee «Dan Brown» y detrás el «copiado» del
sistema— y en las versiones anteriores, donde no hay tal confirmación,
se dice entero.

Va en la fila genérica y no en cada dato, así que vale también para el
autor, la serie, la editorial y las fechas. Una fila que se viera igual
que las demás pero no respondiera parecería estropeada.

Nada cambia de sitio ni de tamaño: la fila solo gana el toque.

(cherry picked from commit e87fb332c845da120f9026dbfbe7dd4dbf2ab7cc)
Resumen, Reseñas y Diverse solo se cambiaban tocando su nombre. Ahora se
pasan también de lado, como la barra de abajo de la aplicación: quien
está leyendo una reseña sigue con el dedo en vez de subir a buscar la
pestaña.

Tocar el nombre sigue funcionando y ahora se desliza hasta allí en vez
de saltar. La pestaña marcada la dice el carrusel, así que no hay dos
sitios donde apuntar cuál está abierta y no pueden discrepar.

El carrusel lleva `weight(1f)`: la columna que lo contiene ya llena la
pantalla, y sin acotarlo la página querría ser infinita.

(cherry picked from commit 29c9a645bae0f5453d5ff130b22765498624681d)
Dos campos que el .json del ejemplar ya traía y se tiraban.

**Copias enlazadas**: los enlaces que alguien ha puesto desde la
instancia —Standard Ebooks, Project Gutenberg y sitios así—, con el
sitio, el formato y si es gratis, de pago o en préstamo. Se enseña el
sitio y no la dirección entera, porque «standardebooks.org» dice más que
setenta caracteres de URL. El mismo enlace sale una vez aunque lo hayan
añadido varias personas.

Van encima de los números: solo uno de cada cincuenta libros los tiene,
pero cuando están son lo que se quiere pulsar.

**Inventaire**: otro identificador del ejemplar, que trae uno de cada
cinco. Va con el ISBN y los demás, así que se copia al tocarlo como
ellos.

Los dos se leen con Gson por el nombre del campo, y un cambio de forma
no daría error: dejaría el campo vacío y la ficha no enseñaría nada. Por
eso van cuatro pruebas sobre la respuesta tal cual la da la instancia,
incluido el caso corriente de que no haya ni lo uno ni lo otro.

(cherry picked from commit dc1de492169f82543269d1dc3857014c8b1032f6)
El .json del libro solo trae las direcciones de sus autores; el nombre, la
biografía y los sitios están en la ficha de cada uno. Se piden **después** de
abrir la ficha y aparecen cuando llegan, así que el libro no espera por esto, y
se guardan por autor: el segundo libro de la misma persona no cuesta nada.
«Actualizar datos» las rehace.

Un bloque por persona y no una lista: con dos autores juntos habría que adivinar
de quién es cada cosa. Los sitios van como botones con icono, centrados. No se
usan los logotipos de Wikipedia ni de Wikidata: son marcas de Wikimedia, fuera
de la licencia libre de los artículos, y meterlas en el paquete es justo donde
da problemas en F-Droid. El icono dice de qué clase de sitio se trata y el texto
dice cuál.
La gráfica de «autores más leídos» decía cuántos libros hay de cada uno
pero no dejaba verlos. Al tocar una barra se abre «Mis libros» en la
estantería de leídos, con los libros de ese autor y las tarjetas de
siempre. Siempre esa estantería: la gráfica se calcula solo con ella,
así que llevar a otra enseñaría una cuenta distinta de la que se acaba
de tocar.

El perfil no cambia de aspecto: la barra solo gana el toque.

Volver deshace un paso cada vez, con el botón de la pantalla o con el
del móvil, porque es el camino que ya existía para los autores.

El objetivo viaja en `ShelfTarget`, que ya llevaba el libro al que salta
la búsqueda. Va el nombre visible y no una clave: es lo que tienen tanto
el perfil como la estantería, y cada uno lo normaliza igual por su
cuenta. Los grupos de autores se arman con los datos por libro, que
tardan un momento en llegar de la caché, así que se espera a que haya
autores antes de decidir; mientras tanto se ve la lista de autores, que
es a dónde lleva ese camino. Si el nombre no cuadra con ningún grupo, se
queda en esa lista en vez de en una pantalla vacía.

(cherry picked from commit 11c9c43509e83feec7a7d390bf492dc7654077bb)
Tocar un año de «libros por año», una nota, un idioma, un formato o la
barra del reto de lectura abre «Mis libros» con esos libros, en las
tarjetas de siempre. El reto lleva al año en curso, que es lo que cuenta.

El perfil no cambia de aspecto: las barras solo ganan el toque. Las que
están a cero no lo tienen, porque llevarían a una lista vacía.

Volver deshace el recorte y deja la estantería entera, con el botón de
la pantalla o con el del móvil.

La regla de qué libros entran vive en `ShelfFiltering`, aparte de la
pantalla y con sus pruebas, porque tiene que quedarse exactamente con
los que contó la gráfica y eso no es lo obvio en tres casos: una
relectura cuenta en el año en que terminó y no en el de la lectura
anterior; una estantería mezcla «Danish» y «Dansk» para el mismo idioma,
y la gráfica los cuenta juntos; y un libro del que aún no se han leído
los datos no tiene ni nota ni fecha, así que no entra en esos dos
recortes en vez de colarse. Si la lista dijera siete donde la barra dice
ocho, la gráfica dejaría de ser de fiar.

(cherry picked from commit 3ed61ea78a68e86007e878e69df3ae915cfa3310)
Al entrar en «Mis libros» desde una gráfica del perfil, el recorte —o el
autor— se quedaba puesto: volver a la pestaña desde la barra de abajo y
abrir cualquier estantería lo aplicaba otra vez, y un recorte que se
acababa de deshacer reaparecía solo.

Ahora la estantería avisa en cuanto se ha quedado con él. El aviso va
después de guardarlo y no antes, porque quitarlo de en medio recompone
la pantalla y, al revés, borraría lo que se acaba de coger.

(cherry picked from commit 3de52fa67b952bd30f041dcc8d8edd260065ad23)
Los dos avisos que hablaban de fechas —los libros que no salen en la
gráfica por años y el «calculado sobre X de Y libros con las dos
fechas»— ahora llevan a la lista de esos libros, con los dos huecos para
ponerlas. Antes había que abrir la ficha de cada uno, y son justo los
libros viejos, que suelen ser muchos.

A diferencia de las páginas, las fechas son de quien lee y no del libro:
esto solo toca la lectura propia. El texto del diálogo lo dice, porque
la otra pantalla se parece y allí sí se cambia la ficha para todos.

Se guarda de uno en uno. Cada libro cuesta una petición para saber si ya
tiene una lectura dada de alta —hay que corregir esa y no crear otra al
lado—, y así se ve cuál ha entrado y cuál no, en vez de un botón que o
todo o nada. Los guardados se quedan en la lista pero apagados: sacarlos
de debajo del dedo haría saltar la fila siguiente al hueco.

El selector de fecha es el mismo que el de la ficha del libro, que ya
existía; solo ha dejado de ser privado.

(cherry picked from commit b28b9e80d11538273311480802b2a4b982a44dd2)
El aviso «X libros sin valorar» lleva ahora a esos libros, con las cinco
estrellas a mano. Tocar otra vez la misma estrella la deja a la mitad,
porque BookWyrm admite medias y el reparto del perfil las enseña.

**Puntuar publica.** En BookWyrm una valoración es una publicación como
otra cualquiera, así que ponerle estrellas a veinte libros viejos manda
veinte cosas a quien te siga. Por eso la visibilidad se elige arriba,
vale para todo el diálogo y viene puesta en privado: rellenar huecos es
querer arreglar las cifras propias, no contárselo a nadie. El texto lo
dice, para que nadie se entere después.

Se guarda de uno en uno, como las páginas y las fechas: cada libro
cuesta una petición para saber su edición y su usuario. `postReviewRating`
ya estaba escrito y no lo llamaba nadie.

(cherry picked from commit f07973b5a613b5240f14eee2ea142cfa341dcd81)
Como las páginas: se listan los libros a los que les falta y se guarda de uno en
uno. Las opciones no van escritas en la aplicación, se leen del formulario de
edición de la instancia, que es quien decide qué formatos admite y cómo se
llaman; una lista copiada aquí envejecería sin avisar. Si el campo no es una
lista, se escribe a mano.

Escribir un campo suelto de la ficha pasa a ser genérico en vez de una copia por
campo, así que páginas, idioma y formato van todos por el mismo sitio.
Un bloque nuevo con los dos extremos: qué se leyó de un tirón y qué costó más,
cada uno con su portada y los días que llevó. Se puede mover y apagar como los
demás desde «Editar página».

Solo entran las lecturas con fecha de inicio **y** de fin, que son las únicas que
se pueden medir; sin ninguna, el bloque no sale en vez de salir vacío. Los días
cuentan los dos extremos, como en la estantería, para que el mismo libro no diga
una cosa aquí y otra allí. Un libro releído cuenta como dos lecturas, igual que
en la media de arriba.

(cherry picked from commit 9091a6620e5b9b226b2928075f622c94ac508c82)
Convivían dos: unas con relieve y otras con contorno. Pasan todas a contorno,
como la del reto de lectura. Eran cinco: la cabecera, la biografía, «a quién
seguir», «mejor valorados» y la de las lecturas más rápida y más lenta.

Dos llevaban además 12 dp de aire por arriba sobre los 16 que ya reparte la
columna, así que se separaban más de la vecina que las demás.

(cherry picked from commit d44f252f22ae933ebced8c823a4eb8e7adcd2d12)
BookWyrm deja crear estanterías además de las cuatro suyas, pero no había manera
de verlas ni de hacerlas desde aquí. Salen en la lista con las demás y se crean
con su nombre, su descripción y su privacidad.

La lista completa se lee de la fila de pestañas de /user/<quien>/books, que es la
única que las trae todas: las transiciones de lectura que devuelve el .json no
son estanterías, aunque lo parezcan.

Los favoritos se montan encima de eso, como una estantería más: así son los
mismos en la web y en la aplicación, y no un apaño que solo entiende este
cliente.
Era una página de 40 kB cada vez que se pasaba por «Mis libros». Una lista de
estanterías cambia dos veces al año, así que se guarda en disco y solo se vuelve
a pedir si no hay nada, si lo guardado tiene ya un día, o si se pide a mano con
«Actualizar datos». Una respuesta que no llega deja lo de antes, sin vaciarlo.
Desde la ficha del libro, eligiendo mover o copiar. Copiar de partida: es lo que
no quita nada de donde estaba. De «Leídos» nunca se mueve, solo se copia: haber
leído un libro no deja de ser cierto porque además esté en otra estantería.
La página del libro solo trae un formulario de quitar, el de la estantería de
lectura, así que estando dentro de una propia se sacaba el libro de «Leídos».
Ahora se quita de la que se está mirando, con su número leído de su propia
página, y no se tocan ni la caché de las otras ni el estado de lectura.
Un solo orden para todas, las cuatro de BookWyrm y las del usuario: separarlas
en dos grupos obligaba a elegir cuál iba antes, y no hay motivo para que las
propias vayan siempre detrás. «Editar página» las mueve y las apaga igual, y un
ajuste esconde el más de crear.

Por dentro pasa a ser una sola lista de identificadores en vez de dos modelos
distintos. Las disposiciones ya guardadas se traen: los identificadores viejos
se reconocen y se convierten al entrar.

La de favoritos lleva su corazón y una línea que la explica; la aplicación sabe
cuál es. Las otras las ha nombrado el usuario y no hay nada que añadir.
Quien no marca favoritos no tiene por qué ver su tarjeta vacía. Se enciende sola
al entrar el primer libro, y solo entonces: si se apaga a mano después, el
segundo no vuelve a encenderla.

(cherry picked from commit aa93c2c931c392388b0d8925d6022deab31db892)
«Leídos» por fecha de fin y «Voy a leer» por título son dos maneras distintas de
querer lo mismo, así que cada una guarda la suya en vez de compartir un ajuste.

(cherry picked from commit d76aa4fdf6fa01e2b42aad640da0c6b88e95b877)
En la lista de una estantería, un corazón sobre la portada de los que lo son. La
lista de cuáles se guarda en disco, así que aparece con la portada y no un rato
después; se refresca una vez al día y al marcar o desmarcar uno.

(cherry picked from commit 402d2af89a4193ff6d49753af519989d5f12838d)
Preguntárselo a la instancia tarda sus segundos y la ficha se abría con el
corazón vacío, que en un libro que uno sabe que es favorito se ve como un fallo.
Se pinta con lo guardado y manda lo que conteste la instancia; si no contesta se
queda lo de antes, que sin red se acerca más que un corazón apagado.

(cherry picked from commit 057950fc58ffe6f8bcba3c4a9e863a90890bd12d)
Entrando por «Autores» a los libros de alguien, su biografía y sus enlaces salen
detrás del último libro. Va fuera de la lista ordenada a propósito: así se queda
al final se ordene por título, por fecha o al revés. Se pide después de pintar
la lista y aparece cuando llega.
El carrusel deshace la pestaña al pasar a la de al lado, así que «Mis libros»
volvía por la lista de estanterías y desde arriba. Se guardan la estantería
abierta, si se estaba dentro de una serie o de un autor, y el libro que estaba
arriba del todo.

El libro y no el número de fila: los libros llegan primero de la caché y luego
de la red, y encima de la lista hay filas que aparecen y desaparecen mientras
carga, de modo que la misma fila deja de ser el mismo sitio.

(cherry picked from commit 9f8cd3786a1108b98c08d11dcbda258077ee01a7)
Con la fecha de inicio y lo que se lleva leído sale un ritmo, y con él los días
que quedan, redondeados hacia arriba: quedando media jornada la respuesta honrada
es «un día», no «cero». Sale en la estantería «Leyendo» y en la ficha del libro.

Sin fecha de inicio, recién empezado o a ritmo de tortuga no se enseña nada: una
previsión sacada del aire es peor que ninguna. La cuenta va aparte y con sus
pruebas, porque el resultado se enseña en dos sitios y tiene que decir lo mismo
en los dos.
Una barra a lo ancho del borde de abajo con lo leído y, centrada justo encima, la
previsión. Separadas del resto por una raya tenue: arriba está lo que el libro
es, aquí cómo va.

La barra son dos cajas y no la de Material: esa deja hueco y puntas redondeadas,
y aquí se busca una línea entera pegada al borde. Sale en cuanto se sabe el
avance, aunque sin fecha de inicio no haya previsión que enseñar.
La ficha avisaba de que algo había cambiado, pero no de qué, así que la barra y
los días de la tarjeta de detrás se quedaban como estaban. Ahora pasa el valor
que acaba de mandarse y la estantería rehace su cuenta con lo que ya tiene en
pantalla —las páginas y la fecha de inicio—, sin pedirle nada más a la instancia.
Sacar por dónde va un libro cuesta una petición, y el carrusel deshace la
pantalla al pasar a la pestaña de al lado: cada vuelta las pedía todas otra vez
para llegar al mismo resultado. Se guardan en disco y solo se preguntan los
libros que no se conocen, los guardados de hace más de una hora, o todos si se
pide «Actualizar datos». Lo que se anota desde la aplicación se escribe a la vez
en lo guardado.
ferlagod closed this pull request 2026-08-15 18:24:24 +00:00

Pull request closed

Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
ferlagod/rocinante_android!30
No description provided.