diff --git a/.github/workflows/Chat.de.WhatsApp.con.Adrian.Pitu (2).txt b/.github/workflows/Chat.de.WhatsApp.con.Adrian.Pitu (2).txt new file mode 100644 index 00000000..5f367dd0 --- /dev/null +++ b/.github/workflows/Chat.de.WhatsApp.con.Adrian.Pitu (2).txt @@ -0,0 +1,2165 @@ +8/3/20 4:15 - Los mensajes y las llamadas están cifrados de extremo a extremo. Nadie fuera de este chat, ni siquiera WhatsApp, puede leerlos ni escucharlos. Toca para obtener más información. +8/3/20 4:15 - Adrian Pitu: Fichada +8/3/20 4:15 - Adrian Pitu: 😏 +8/3/20 4:28 - Beatriz: 😉 +8/3/20 4:29 - Adrian Pitu: Encantado de conocerte +8/3/20 4:41 - Beatriz: Igualmente! +8/3/20 4:53 - Adrian Pitu: 🤗🤗🤗 +8/3/20 13:10 - Beatriz: Buenos días! +8/3/20 13:22 - Adrian Pitu: Buenos dias señorita +8/3/20 13:22 - Adrian Pitu: Te suena esto? +8/3/20 13:23 - Adrian Pitu: +8/3/20 13:33 - Beatriz: Siiii +8/3/20 13:33 - Beatriz: Yo ayer tenía alguno igual! +8/3/20 13:34 - Beatriz: Jejeje +8/3/20 13:43 - Adrian Pitu: Si? +8/3/20 13:43 - Adrian Pitu: No me lo creo +8/3/20 14:07 - Beatriz: Creelo! +8/3/20 14:08 - Beatriz: Alguno tuve y es posible que alguno tenga aún +8/3/20 14:20 - Adrian Pitu: Yo tengo q volver +8/3/20 14:20 - Adrian Pitu: Otra noche mas +8/3/20 14:20 - Adrian Pitu: O varias +8/3/20 14:20 - Adrian Pitu: 😏 +8/3/20 14:21 - Beatriz: Si vas 14 o 18, te invito a un gin +8/3/20 14:31 - Adrian Pitu: Me apunto el dia 14 +8/3/20 14:31 - Adrian Pitu: Y el 16 +8/3/20 14:31 - Adrian Pitu: 17 y 18 +8/3/20 14:31 - Adrian Pitu: Cuela? +8/3/20 14:58 - Beatriz: Jajaja +8/3/20 14:58 - Beatriz: Al final acabas apuntado a la Nova! +8/3/20 16:04 - Adrian Pitu: Yo creo q si +8/3/20 16:04 - Adrian Pitu: Ya lo veras +8/3/20 16:04 - Adrian Pitu: Y eso q no soy muy fallero +8/3/20 16:15 - Beatriz: Yo creo que en las fallas está realmente la fiesta fallera +8/3/20 16:19 - Adrian Pitu: Si la verdad q si +8/3/20 16:19 - Adrian Pitu: Pero a la proxima llevare chaleco fallero +8/3/20 16:19 - Adrian Pitu: Q ayer me sentia como un extranjero +8/3/20 16:19 - Adrian Pitu: 😬 +8/3/20 19:09 - Beatriz: Jajaja +8/3/20 19:10 - Beatriz: Algo fallero, si... Pañuelo, chaleco, bluson +8/3/20 19:10 - Beatriz: Bhttps://cloud.google.com/secret-manager/docs/uena idea! +9/3/20 7:56 - Adrian Pitu: Buenos dias +9/3/20 7:56 - Adrian Pitu: Gracias por las ideas +9/3/20 7:56 - Adrian Pitu: Las tendre en cuenta +9/3/20 7:56 - Adrian Pitu: 🤗🤗🤗 +9/3/20 7:56 - Adrian Pitu: Sino llevo algo fallero no me dejeis ir a la falla +9/3/20 10:19 - Beatriz: Tranquilo, ahí las Valero tenemos mano, así que dejarte ir, te dejaran ir😂 +9/3/20 11:26 - Beatriz: Que duros son los lunes en un hospital🙄 +9/3/20 11:30 - Adrian Pitu: Biiennn +9/3/20 11:30 - Adrian Pitu: Venga a trabajar +9/3/20 11:30 - Adrian Pitu: Yo empiezo mañana +9/3/20 11:33 - Beatriz: Mañana? +9/3/20 11:35 - Beatriz: Ya llevo unas horitas... +9/3/20 11:36 - Adrian Pitu: Siiii +9/3/20 11:36 - Adrian Pitu: Hoy dia libre de examen +9/3/20 11:36 - Adrian Pitu: He dejado a tu hermana sola +9/3/20 11:37 - Beatriz: Bueno, va de mañana.... Te lo perdono +9/3/20 12:10 - Adrian Pitu: Menosmal q me perdonas +9/3/20 12:10 - Adrian Pitu: 🤗🤗 +9/3/20 12:16 - Beatriz: Tienes suerte! +9/3/20 15:36 - Adrian Pitu: Ya habras acabado tu no? +9/3/20 15:36 - Adrian Pitu: De trabajar +9/3/20 15:50 - Beatriz: No +9/3/20 15:50 - Beatriz: Aun no +9/3/20 15:50 - Beatriz: Me queda media horita más o menos +9/3/20 16:24 - Adrian Pitu: Ya sales +9/3/20 16:24 - Adrian Pitu: Venga a disfrutar de la tard +9/3/20 17:24 - Beatriz: Al final, como siempre, más tarde... Por no haber aprobado una oposición!!? JAJAJAJA🤷🏼‍♀ +9/3/20 17:25 - Beatriz: Como ha ido? +9/3/20 18:36 - Adrian Pitu: Bueno mientras q te guste el trabajo +9/3/20 18:36 - Adrian Pitu: Es asi por ahora +9/3/20 18:36 - Adrian Pitu: El examen bien +9/3/20 18:36 - Adrian Pitu: Ya veremos la nota +9/3/20 18:47 - Beatriz: Me encanta! +9/3/20 21:22 - Adrian Pitu: Pues te pasa como a mi +9/3/20 21:22 - Adrian Pitu: No podria trabajar de otra cosa +10/3/20 11:56 - Beatriz: Ejem,ejem.... Sr. Agente... Uso de móvil conduciendo???? 🙄 +10/3/20 12:14 - Adrian Pitu: Buenos dias +10/3/20 12:14 - Adrian Pitu: Ups un lapsus temporal +10/3/20 12:14 - Adrian Pitu: Todo autorizado +10/3/20 12:14 - Beatriz: Jajajaja +10/3/20 12:46 - Adrian Pitu: No volvera a pasar +10/3/20 12:46 - Adrian Pitu: 😬 +10/3/20 12:47 - Beatriz: 🤐 +10/3/20 12:51 - Adrian Pitu: Alguno mas habrá... +10/3/20 12:52 - Beatriz: Alguno más agente happy, o momento como ese? +10/3/20 13:03 - Adrian Pitu: No habra otro +10/3/20 13:04 - Adrian Pitu: Pero sin conducir +10/3/20 13:04 - Adrian Pitu: Tengo q dar ejemplo +10/3/20 13:17 - Beatriz: Juventud!!! divino tesoro! 😂 +10/3/20 14:06 - Beatriz: Que casualidad! +Hoy también era el cumple de nuestro iaio. +Esta noche en casa, subiré una foto🥰 +10/3/20 14:59 - Adrian Pitu: Jajjajaa q bueno +10/3/20 14:59 - Adrian Pitu: Vaya q casualidad la verdad +10/3/20 22:47 - Adrian Pitu: Fallas aplazadas señorita +10/3/20 22:47 - Adrian Pitu: Ohhh +10/3/20 22:47 - Beatriz: 😔 +10/3/20 22:47 - Beatriz: Si +10/3/20 22:47 - Beatriz: Sin precedentes el alcance de esto +10/3/20 22:48 - Adrian Pitu: Ya te digo +10/3/20 22:48 - Adrian Pitu: No se como acabara esto +10/3/20 22:55 - Beatriz: Yo tampoco +10/3/20 22:55 - Beatriz: No es el impacto económico por turismo +10/3/20 22:56 - Beatriz: Es el trabajo de un año, los artistas no cobran hasta que plantan,las ilusiones, la devocion +10/3/20 22:56 - Beatriz: Vacaciones programadas +10/3/20 22:56 - Adrian Pitu: Si si +10/3/20 22:56 - Adrian Pitu: Un poco de todo +10/3/20 22:56 - Beatriz: Pymes que dependen de las fallas +10/3/20 22:56 - Adrian Pitu: Y esperate que no cierren colegios +10/3/20 22:56 - Beatriz: En su facturación anual +10/3/20 22:56 - Beatriz: Un desastre +10/3/20 22:57 - Beatriz: Sin precedentes! +10/3/20 22:57 - Beatriz: Sería lo lógico +10/3/20 22:57 - Adrian Pitu: Un desastre si +10/3/20 22:57 - Adrian Pitu: La verdad +10/3/20 22:57 - Beatriz: 😔 +10/3/20 22:57 - Beatriz: Mi traje nuevo🤦🏼‍♀ +10/3/20 22:57 - Adrian Pitu: Vaya tela +10/3/20 22:57 - Beatriz: Mi hija dama de honor +10/3/20 22:57 - Adrian Pitu: Lo nunca visto +10/3/20 22:57 - Beatriz: 😭 +10/3/20 22:58 - Beatriz: En fin +10/3/20 22:58 - Adrian Pitu: Parece de pelicula +10/3/20 22:58 - Adrian Pitu: En fin si +10/3/20 22:58 - Beatriz: Lo primero la salud pública +10/3/20 22:58 - Adrian Pitu: Eso ante todo +10/3/20 23:04 - Adrian Pitu: Pues nada por ahora no me apunto a la falla +10/3/20 23:04 - Adrian Pitu: 🙄 +10/3/20 23:10 - Beatriz: Jajajaja +10/3/20 23:10 - Beatriz: No, este año es tirar el dinero +11/3/20 6:32 - Adrian Pitu: Buenos dias +11/3/20 6:32 - Adrian Pitu: Perdona q me quede frito durmiendo +11/3/20 6:32 - Adrian Pitu: Vaya tela q derroche de dinero +11/3/20 9:06 - Adrian Pitu: Menudo mosqueo lleva tu hermana esta mañana +11/3/20 9:06 - Adrian Pitu: 😬 +11/3/20 9:14 - Beatriz: Claro.... +11/3/20 9:14 - Beatriz: Pues mi hermana Mosqueda... Uuuuh🤦🏼‍♀ +11/3/20 9:15 - Adrian Pitu: Si si +11/3/20 9:15 - Adrian Pitu: Vaya mañanita me lleva +11/3/20 9:15 - Adrian Pitu: 😬 +11/3/20 9:28 - Beatriz: Jajaja +11/3/20 9:28 - Beatriz: Comprensión y la ciencia! +11/3/20 9:28 - Beatriz: Paciencia +11/3/20 10:14 - Adrian Pitu: Tal cual si +11/3/20 10:15 - Adrian Pitu: Pero bueno asi sera esta semana +11/3/20 10:15 - Adrian Pitu: Yo que iba el sabado a tu falla +11/3/20 10:15 - Adrian Pitu: 🙄 +11/3/20 10:20 - Beatriz: Que desastre +11/3/20 12:54 - Adrian Pitu: Pero bueno +11/3/20 12:54 - Adrian Pitu: Dan lluvias +11/3/20 12:54 - Adrian Pitu: Para la semana q viene +11/3/20 12:54 - Adrian Pitu: Asi q por un lado mejor no? +11/3/20 12:57 - Beatriz: Si +11/3/20 12:58 - Beatriz: No hay mal que por bien no venga +11/3/20 12:58 - Beatriz: Entre poder hacerlas y que se estropeen y no poder hacerlas y posponer para que salgan bien.... +11/3/20 12:58 - Beatriz: Prefiero la segunda +11/3/20 12:59 - Beatriz: Además de que vamos a vivir unas fallas únicas en la historia de las fallas.... Inolvidables! +11/3/20 13:44 - Adrian Pitu: Yo tambien +11/3/20 13:45 - Adrian Pitu: Esto es para hacer una pelicula del tema de coronavirus +11/3/20 13:46 - Beatriz: Aun no... Falta por estrenarse la segunda parte +11/3/20 13:51 - Beatriz: Wow!!! 🙃 +11/3/20 13:54 - Adrian Pitu: Siii llegara despues de verano +11/3/20 13:54 - Beatriz: Otra vez? 😂 Ay ay ay.... Estos agentes jóvenes...😂 +Me gusta la música que escuchas +Y comparto Que conducir de madrugada, antes de que salga el sol y el mundo, con música es genial!!! +11/3/20 13:56 - Adrian Pitu: Si si otra vez😔 +11/3/20 13:56 - Adrian Pitu: Pero me gusta siempre ir con musica en el coche +11/3/20 13:56 - Adrian Pitu: Se note ehhh +11/3/20 13:56 - Adrian Pitu: Me alegra saber q te gusta la misma musica +11/3/20 13:59 - Beatriz: 😂😂😂😂 +11/3/20 14:00 - Beatriz: Yo tb lo hago +11/3/20 14:01 - Beatriz: Y seguro que a más velocidad que tu🙄 +11/3/20 14:54 - Adrian Pitu: Anda +11/3/20 14:54 - Adrian Pitu: Luego me dices a mi +11/3/20 14:54 - Adrian Pitu: Y tu eres mas yidhadista q yo +11/3/20 14:55 - Adrian Pitu: Y a mas velocidad? +11/3/20 14:55 - Adrian Pitu: Voy apuntando📝 +13/3/20 16:26 - Beatriz: No hay otra!!! +13/3/20 16:29 - Adrian Pitu: Pues eso +13/3/20 16:29 - Adrian Pitu: Yo hoy me despido del gym +13/3/20 16:30 - Beatriz: Si, si +13/3/20 16:30 - Beatriz: Multitudes ni una +13/3/20 16:31 - Adrian Pitu: Esto de pelicula +13/3/20 16:31 - Adrian Pitu: En serio +13/3/20 16:34 - Beatriz: No hemos vivido ni esperábamos en este siglo, vivir algo así +13/3/20 16:35 - Adrian Pitu: Vaya +13/3/20 16:35 - Adrian Pitu: Toda la razon +13/3/20 16:35 - Adrian Pitu: Parece el fin del mundo +13/3/20 16:54 - Beatriz: Parece +13/3/20 16:57 - Adrian Pitu: Tu bien por el hospital? +13/3/20 16:58 - Beatriz: Un caos +13/3/20 16:58 - Beatriz: Esta mañana he empezado a anular intervenciones +13/3/20 16:59 - Beatriz: Y el personal crítico, solo iremos al hospital en caso necesario +13/3/20 16:59 - Adrian Pitu: Vaya tela +13/3/20 16:59 - Adrian Pitu: Mucho peor q en mi trabajo +13/3/20 16:59 - Beatriz: La putada es que l@s recepcionistas están súper expuestos sin ser personal sanutario y tienen que seguir con sus turnos +13/3/20 17:00 - Beatriz: Ahora valoro más mi trabajo +13/3/20 17:01 - Beatriz: Personal crítico es el que soporta las cargas de responsabilidad, que ni tienen sustituto y no pueden dejar de trabajar... Pero ahora los primeros en saltar a los botes. +13/3/20 17:01 - Beatriz: Una recompensa a la dedicación 24h que desconocía🤷🏼‍♀ +13/3/20 17:07 - Adrian Pitu: Bueno de todas formas ten cuidado y extrema precauciones +13/3/20 17:07 - Beatriz: En principio, no he de ir al hospital, puedo trabajar desde casa +13/3/20 17:08 - Adrian Pitu: Ya pero de todas maneras +13/3/20 17:08 - Adrian Pitu: Con cuidado +13/3/20 17:08 - Adrian Pitu: A mi me toca la calle si o si +13/3/20 17:09 - Beatriz: Este finde... +13/3/20 17:10 - Beatriz: Si +13/3/20 17:10 - Beatriz: Lo mismo digo +13/3/20 17:10 - Beatriz: Extremad precauciones al máximo +13/3/20 17:38 - Adrian Pitu: Si si +13/3/20 17:38 - Adrian Pitu: Tu hermana y yo tenemos cuidado +13/3/20 17:38 - Adrian Pitu: Vamos con el gel sin parar +13/3/20 17:38 - Adrian Pitu: Y con cuidado si +13/3/20 17:38 - Beatriz: Pasará.... +13/3/20 17:41 - Adrian Pitu: Si si +13/3/20 17:41 - Adrian Pitu: Pero no se sabe cuando +13/3/20 18:19 - Beatriz: Me acaban de mandar unos vídeos +13/3/20 18:19 - Beatriz: Pfffff +13/3/20 18:19 - Beatriz: Que dan terror +13/3/20 18:20 - Beatriz: De china +13/3/20 18:50 - Adrian Pitu: Si? +13/3/20 18:50 - Adrian Pitu: Madremia +13/3/20 18:52 - Beatriz: Pffff +13/3/20 18:54 - Adrian Pitu: Que panorama +17/3/20 19:42 - Adrian Pitu: Señorita +17/3/20 19:42 - Adrian Pitu: Como va todo? +17/3/20 20:22 - Beatriz: Hello +17/3/20 20:22 - Beatriz: Pues bien +17/3/20 20:23 - Beatriz: Trabajando a ratos, escuchando música otros, limpiando y cambiando armarios, redes sociales... Lo normal, vamos! 😂 +17/3/20 20:23 - Beatriz: Que tal tu? +17/3/20 20:23 - Adrian Pitu: Jajjaa vamos que sin parar +17/3/20 20:24 - Adrian Pitu: La casa la tienes q tener como la patena +17/3/20 20:24 - Adrian Pitu: Yo bien con ganas que me llamen a trabajar +17/3/20 20:24 - Adrian Pitu: Voy por el segundo dia encerrado +17/3/20 20:24 - Adrian Pitu: Solo he salido a llevar medicacion y ropa a mis padres al chalet +17/3/20 20:24 - Adrian Pitu: Que los tengo alli +19/3/20 13:02 - Beatriz: 🥰😍😘 +19/3/20 17:17 - Adrian Pitu: +21/3/20 17:21 - Beatriz: Libertad!!! +21/3/20 17:30 - Adrian Pitu: Que rato mas bueno +21/3/20 17:30 - Adrian Pitu: 🤗🤗🤗 +21/3/20 18:03 - Beatriz: Lo he sentido! +21/3/20 18:04 - Adrian Pitu: Y que tal? +21/3/20 18:04 - Adrian Pitu: El lunes hare otro video asi +21/3/20 18:06 - Beatriz: Lo sentí ayer +21/3/20 18:06 - Beatriz: Mis hijos están con su padre en Madsamagrell +21/3/20 18:06 - Beatriz: Y fui a hacerles la compra aprovechando que tb lo hacía para mi padre +21/3/20 18:06 - Beatriz: Y lo sentí +21/3/20 18:06 - Beatriz: Triste.... Pq por la autopista iba sola +21/3/20 18:07 - Beatriz: Me paro la GC +21/3/20 18:07 - Beatriz: Tuve que mostrarles el justificante que me hicieron de Quirón... +21/3/20 18:07 - Beatriz: Pero me puse Millenium a tope! Y sentí algo tan sencillo como libertad +21/3/20 18:07 - Beatriz: Que triste.... +21/3/20 18:08 - Beatriz: También lloré, la verdad +21/3/20 18:08 - Adrian Pitu: Madremia +21/3/20 18:08 - Adrian Pitu: Como cambia todo a que si +21/3/20 18:08 - Adrian Pitu: En poco tiempo +21/3/20 18:08 - Adrian Pitu: Normal que lloraras +21/3/20 18:09 - Adrian Pitu: La libertad ahora no tiene precio +21/3/20 18:09 - Adrian Pitu: Temazo +21/3/20 18:27 - Adrian Pitu: Ya lo veras +21/3/20 18:35 - Beatriz: Me da pánico lo que tenga que venir, no lo que ocurre ahora +21/3/20 18:35 - Beatriz: Pienso que nada va a ser igual ya +21/3/20 18:35 - Adrian Pitu: Bueno ya iremos viendo +21/3/20 18:35 - Adrian Pitu: No vamos a pensar cosas +21/3/20 18:35 - Adrian Pitu: Que luego no van a pasr +21/3/20 18:36 - Beatriz: También.... +21/3/20 18:36 - Beatriz: 🙃 +21/3/20 18:37 - Adrian Pitu: Tenemos que tener pensamientos positivos +21/3/20 18:37 - Adrian Pitu: Hacer un hueco para pensar +21/3/20 18:38 - Adrian Pitu: Y asi atraemos lo positivo +21/3/20 18:38 - Adrian Pitu: Que lo malo viene solo +21/3/20 18:45 - Beatriz: Es que creo que no va a volver a haber fiestas multitudinarias, que habrá aforos limitados en los C. C. Y que viviremos con la sospecha y psicosis de un virus cruel. +21/3/20 18:46 - Adrian Pitu: No te creas que sera asi +21/3/20 18:46 - Adrian Pitu: Se ira poco a poco extinguiendo ese virus +21/3/20 18:47 - Adrian Pitu: Hasta que no nos acordemos +21/3/20 18:47 - Adrian Pitu: Pero los aforos en fiestas llevaran meses controlandolos +21/3/20 18:48 - Beatriz: Otro GC fallecido? +21/3/20 18:48 - Adrian Pitu: Si +21/3/20 18:48 - Adrian Pitu: 😔 +21/3/20 18:48 - Beatriz: 😔 +21/3/20 18:48 - Adrian Pitu: Este es el pan de cada dia +21/3/20 18:49 - Adrian Pitu: En fin +21/3/20 18:49 - Beatriz: Es absolutamente increíble que esto esté ocurriendo +21/3/20 18:50 - Adrian Pitu: Esto solo se veia en las peliculas +21/3/20 18:50 - Adrian Pitu: Y mira desgraciadamente nos has tocado +21/3/20 18:52 - Beatriz: Trabajo para las editoriales; cambiar la historia en los textos🤷🏼‍♀ +21/3/20 18:56 - Adrian Pitu: Y tanto que si +21/3/20 18:56 - Adrian Pitu: Sera una epoca q no olvidaremos +21/3/20 18:59 - Beatriz: 😢 +21/3/20 18:59 - Adrian Pitu: Venga mucho animo +21/3/20 18:59 - Adrian Pitu: Que te mando +21/3/20 18:59 - Adrian Pitu: Acuerdate que quemaremos tu falla +21/3/20 19:00 - Adrian Pitu: 😏 +21/3/20 19:01 - Beatriz: Me preocupo por la sociedad, yo se que estaré bien... +21/3/20 19:01 - Adrian Pitu: Ya +21/3/20 19:02 - Adrian Pitu: Todos estamos preocupados +21/3/20 19:02 - Adrian Pitu: Porque se esta llevando vidas +21/3/20 19:02 - Adrian Pitu: Y no podemos hacer nada +21/3/20 19:02 - Adrian Pitu: Solo estar en casa +21/3/20 19:02 - Adrian Pitu: Y aguantar +21/3/20 19:05 - Beatriz: Aguantaremos +21/3/20 19:05 - Beatriz: Con las casas limpisimas! 😂 +21/3/20 19:05 - Beatriz: Mira que yo soy Tiquismiquis con la limpieza, recoger.... +21/3/20 19:06 - Beatriz: Ahora mi casa es tan aséptica como un quirófano! +21/3/20 19:06 - Adrian Pitu: Me lo creo +21/3/20 19:07 - Adrian Pitu: Da tiempo a dejar la casa como la patena +21/3/20 19:08 - Beatriz: 🤷🏼‍♀ +21/3/20 19:09 - Adrian Pitu: El dia es muy largo +21/3/20 19:09 - Adrian Pitu: Cuando no se va a trabajar +21/3/20 19:15 - Beatriz: Sip +21/3/20 19:16 - Adrian Pitu: Pero la casa se hace pequeña +21/3/20 19:16 - Adrian Pitu: Yo me bajo al garaje a correr +21/3/20 19:16 - Adrian Pitu: Tiene tres plantas +21/3/20 19:17 - Beatriz: 3 plantas???? +21/3/20 19:17 - Adrian Pitu: Siii +21/3/20 19:17 - Beatriz: Para ti solo??? +21/3/20 19:17 - Adrian Pitu: Ojala +21/3/20 19:17 - Adrian Pitu: Pero no +21/3/20 19:17 - Adrian Pitu: Es comunitario +21/3/20 19:17 - Beatriz: Vives en una comuna? +21/3/20 19:18 - Adrian Pitu: Siiii +21/3/20 19:21 - Beatriz: Que Moderno eres!!!! +21/3/20 19:21 - Adrian Pitu: Si si +21/3/20 19:21 - Adrian Pitu: Como forest gump +21/3/20 19:21 - Adrian Pitu: Yo solo +21/3/20 19:21 - Adrian Pitu: Y luego un quinto por las escaleras +21/3/20 19:21 - Beatriz: Cómo??? 😂😂😂 +21/3/20 19:21 - Adrian Pitu: Si si +21/3/20 19:22 - Adrian Pitu: Subo y bajo varias veces +21/3/20 19:22 - Adrian Pitu: Con una mochila con peso +21/3/20 19:22 - Adrian Pitu: Eso hacia cuando entrenaba con bomberos +21/3/20 19:22 - Adrian Pitu: Asi se nota mas +21/3/20 19:26 - Beatriz: 😳 +21/3/20 19:27 - Beatriz: ‎IMG-20200321-WA0109.jpg (archivo adjunto) +21/3/20 19:28 - Beatriz: El viernes 13, me la llevó una compañera a Quirón pq le estorbaba y no sabía ni si funcionaba.... +21/3/20 19:28 - Beatriz: Me la traje y funciona!!! +21/3/20 19:28 - Beatriz: Suerte inmensa! +21/3/20 19:28 - Beatriz: En la terraza, orientada así, tengo más sensación de ir por la calle +21/3/20 19:31 - Adrian Pitu: Madremia +21/3/20 19:32 - Adrian Pitu: Oye q pedazo de terraza +21/3/20 19:32 - Adrian Pitu: Pues mira genial +21/3/20 19:32 - Adrian Pitu: Por lo menos haces deporte +21/3/20 19:32 - Adrian Pitu: Y esta dandote el aire +21/3/20 19:33 - Beatriz: Siiiiiii... Por los pelos no me ha pillado la cuarentena sin esto😂 +21/3/20 19:35 - Beatriz: No es muy grande... Unos 12m2 en triángulo.... Pero da su juego +21/3/20 19:38 - Adrian Pitu: Exacto +21/3/20 19:38 - Adrian Pitu: Si si +21/3/20 19:38 - Adrian Pitu: Oye algo es algo +21/3/20 19:38 - Adrian Pitu: Por lo menos +21/3/20 19:39 - Adrian Pitu: Te pones a andar en la cinta +21/3/20 19:39 - Adrian Pitu: Y miras al horizonte +21/3/20 19:39 - Adrian Pitu: Y te despejas +21/3/20 19:54 - Adrian Pitu: Un video para q te animes +21/3/20 19:55 - Adrian Pitu: +21/3/20 20:21 - Beatriz: 🥰 +21/3/20 20:22 - Beatriz: Esa canción me libera!!! +21/3/20 20:22 - Beatriz: Me he Unido a una sesión en directo mientras limpiaba la mampara de un baño +21/3/20 20:22 - Beatriz: Y he bailado más que limpiar😂 +21/3/20 20:24 - Adrian Pitu: Es lo que toca +21/3/20 20:24 - Adrian Pitu: Claro q si +21/3/20 20:24 - Beatriz: Gracias! 😘 +21/3/20 20:24 - Adrian Pitu: Asi te despejas y no piensas +21/3/20 20:24 - Adrian Pitu: No me las des +21/3/20 20:24 - Adrian Pitu: Estoy se hara mas ameno +21/3/20 20:24 - Adrian Pitu: Ya lo veras +21/3/20 20:24 - Beatriz: Si +21/3/20 20:30 - Adrian Pitu: Con musica todo sera mas ameno +21/3/20 20:30 - Adrian Pitu: Y deja de limpiar +21/3/20 20:30 - Adrian Pitu: Relax +21/3/20 20:30 - Adrian Pitu: Que es sabado +21/3/20 20:52 - Beatriz: Jajaja +21/3/20 20:52 - Beatriz: No distingo ya los días +21/3/20 20:52 - Beatriz: Sin todos igualitos +21/3/20 21:36 - Adrian Pitu: Si si +21/3/20 21:36 - Adrian Pitu: Como la pelicula +21/3/20 21:36 - Adrian Pitu: El dia de la marmota +21/3/20 21:36 - Adrian Pitu: Todos los dias son iguales +21/3/20 21:37 - Beatriz: Ains +21/3/20 21:38 - Beatriz: Me acaban de pasar el parte diario de Quirón +21/3/20 21:38 - Beatriz: +21/3/20 21:42 - Adrian Pitu: Madremia +21/3/20 21:42 - Adrian Pitu: Vaya tela como esta el panorama +21/3/20 21:42 - Adrian Pitu: Valencia es peligrosa +21/3/20 21:42 - Beatriz: Flipo con Murcia +21/3/20 21:42 - Adrian Pitu: Murcia se lo toman a rajatabla +21/3/20 21:43 - Beatriz: Entre C. Valenciana y C. Mancha.... Azotadas ambas +21/3/20 21:43 - Beatriz: Y Murcia.... Como si estuviera fuera de la península +21/3/20 21:43 - Adrian Pitu: Si si lo veo +21/3/20 21:44 - Adrian Pitu: En murcia es otra cosa +21/3/20 21:44 - Beatriz: Curioso +21/3/20 21:45 - Beatriz: Quizás menos Turismo.... +21/3/20 21:46 - Adrian Pitu: Pues si +21/3/20 21:46 - Adrian Pitu: Exacto +21/3/20 21:46 - Adrian Pitu: No es tan visitado +21/3/20 21:48 - Beatriz: No se puede v tener todo +21/3/20 21:48 - Beatriz: Valencia es única y es preciosa! +21/3/20 21:51 - Adrian Pitu: Valencia es unica +21/3/20 21:51 - Adrian Pitu: Por eso viene toda l gente aqui +21/3/20 21:51 - Adrian Pitu: Asi ha pasado +21/3/20 21:53 - Beatriz: De haber seguido con fallas.... Hubiera sido un genocidio en toda regla! 😟 +21/3/20 21:53 - Adrian Pitu: Ya te digo +21/3/20 21:54 - Adrian Pitu: Hubiera habido un caos +21/3/20 21:54 - Beatriz: Hubieseis pasado de 7x7 a 24/7 +21/3/20 21:54 - Beatriz: Uf! +21/3/20 21:57 - Adrian Pitu: Tal cual +21/3/20 21:57 - Adrian Pitu: Se hubiera complicado mucho el tema +21/3/20 21:57 - Beatriz: Tengo día teorías para esto +21/3/20 21:58 - Beatriz: Una; Trump la ha liado +21/3/20 21:58 - Beatriz: Dos; aviso y reciclaje natural +21/3/20 21:58 - Adrian Pitu: Yo te digo mi teoria +21/3/20 21:58 - Adrian Pitu: Trump +21/3/20 21:58 - Beatriz: Dime +21/3/20 21:58 - Beatriz: Verdad? +21/3/20 21:59 - Beatriz: Y se contagió pq pagó en B +21/3/20 21:59 - Adrian Pitu: Si +21/3/20 21:59 - Adrian Pitu: Asi fue +21/3/20 21:59 - Adrian Pitu: Asi es perdon +21/3/20 21:59 - Adrian Pitu: Guerra con los chinos +21/3/20 22:00 - Beatriz: Es una guerra biológica; Se valoró la pérdida de medio/ un millón de vidas y eso es barato +21/3/20 22:00 - Beatriz: Y la vacuna existe ya +21/3/20 22:00 - Beatriz: Es cuestion de que el poder sea absoluto otra vez para EEUU +21/3/20 22:00 - Beatriz: En ese momento, saldrá la vacuna a la luz +21/3/20 22:01 - Beatriz: Y a engrosar más bolsillos y monópolis +21/3/20 22:01 - Beatriz: 💪🏻😘 +21/3/20 22:02 - Adrian Pitu: Asi es +21/3/20 22:02 - Adrian Pitu: Te doy la razon +21/3/20 22:02 - Adrian Pitu: Yo pienso lo mismo +21/3/20 22:04 - Beatriz: Eres un hombre inteligente! 😂 +21/3/20 22:08 - Adrian Pitu: Bueno +21/3/20 22:08 - Adrian Pitu: Todo es deducir +21/3/20 22:08 - Adrian Pitu: Y saco en conclusion +21/3/20 22:08 - Adrian Pitu: Que los americanos +21/3/20 22:09 - Adrian Pitu: Son los responsables +21/3/20 22:09 - Beatriz: Era en tono sarcástico... Porque piensas como yo🙄😂 +21/3/20 22:10 - Adrian Pitu: Ya ya lo se +21/3/20 22:19 - Beatriz: Voy a arreglarme que a las 22;30 me llaman para tomar un gin😉 +21/3/20 22:19 - Beatriz: Por vídeo🤷🏼‍♀ +21/3/20 22:20 - Adrian Pitu: Anda +21/3/20 22:20 - Adrian Pitu: Jajaja q bueno +21/3/20 22:20 - Adrian Pitu: Venga arreglate +21/3/20 22:20 - Adrian Pitu: No te molesto +21/3/20 22:20 - Adrian Pitu: +21/3/20 22:20 - Adrian Pitu: A tu salud +21/3/20 22:20 - Beatriz: Si... Tengo un amigo que esta muy ploff y se lo he propuesto a 2 mas y vamos a hacerlo +21/3/20 22:21 - Beatriz: Me encanta el vino! +21/3/20 22:21 - Beatriz: Graaaaacias! 😚 +21/3/20 22:21 - Adrian Pitu: Muy bien +21/3/20 22:21 - Adrian Pitu: Animalo +21/3/20 22:21 - Adrian Pitu: Y a mi +21/3/20 22:22 - Beatriz: 🤗 +21/3/20 23:03 - Beatriz: ‎IMG-20200321-WA0162.jpg (archivo adjunto) +Chin Chin! +21/3/20 23:04 - Adrian Pitu: +Chin chin +21/3/20 23:08 - Adrian Pitu: Como va el cubata? +21/3/20 23:09 - Beatriz: A mi se me agúa +21/3/20 23:09 - Adrian Pitu: Si? +21/3/20 23:09 - Adrian Pitu: No me digas +21/3/20 23:10 - Beatriz: Si +21/3/20 23:10 - Beatriz: Mi tolerancia al alcohol es de primero de BUP +21/3/20 23:10 - Adrian Pitu: Si? +21/3/20 23:10 - Adrian Pitu: Que va +21/3/20 23:10 - Adrian Pitu: Jajaja +21/3/20 23:11 - Beatriz: Siiiiii +21/3/20 23:11 - Beatriz: Cortitos de Ginebra y poquito a poco +21/3/20 23:15 - Adrian Pitu: Bueno +21/3/20 23:15 - Adrian Pitu: Poco a poco +21/3/20 23:15 - Adrian Pitu: Jajaa +21/3/20 23:15 - Adrian Pitu: En tu falla +21/3/20 23:15 - Adrian Pitu: Los ponian cargados +21/3/20 23:16 - Beatriz: A mi no +21/3/20 23:16 - Adrian Pitu: A mi si +21/3/20 23:16 - Adrian Pitu: Me vieron cara de extranjero +21/3/20 23:16 - Beatriz: No +21/3/20 23:17 - Beatriz: Yo les paro.... Digo; ya, ya! +21/3/20 23:21 - Adrian Pitu: Yo no les dije nada +21/3/20 23:21 - Adrian Pitu: Y no veas +21/3/20 23:21 - Beatriz: Jsjsjsjs +21/3/20 23:22 - Beatriz: Y luego conducir +21/3/20 23:22 - Beatriz: Aaaaay🤦🏼‍♀ +21/3/20 23:22 - Adrian Pitu: No conducia +21/3/20 23:23 - Beatriz: Ah +21/3/20 23:23 - Adrian Pitu: Conducia mi amigo +21/3/20 23:23 - Adrian Pitu: Yo no +21/3/20 23:23 - Adrian Pitu: Aproveche +21/3/20 23:23 - Beatriz: Que es poli, tb... No? +21/3/20 23:23 - Adrian Pitu: Si si +21/3/20 23:23 - Adrian Pitu: Aunq no lo parezca +21/3/20 23:40 - Beatriz: Me han llamado, perdona +21/3/20 23:40 - Beatriz: Por la talla, dices? +21/3/20 23:41 - Adrian Pitu: Si si +21/3/20 23:41 - Adrian Pitu: Por talla +21/3/20 23:41 - Adrian Pitu: Me los ponian cargados +21/3/20 23:41 - Adrian Pitu: No te preocupes +21/3/20 23:42 - Adrian Pitu: Sabes esta llovien +21/3/20 23:42 - Adrian Pitu: Lloviendo +21/3/20 23:43 - Beatriz: Eso me han dicho +21/3/20 23:43 - Beatriz: Ojalá llegara ya el calor +21/3/20 23:44 - Beatriz: Eso ayudaría a frenar el bicho +21/3/20 23:44 - Beatriz: Pero el frío y la lluvia.... No es momento este año +21/3/20 23:44 - Adrian Pitu: Exacto ai +21/3/20 23:44 - Adrian Pitu: Si +21/3/20 23:44 - Adrian Pitu: Pero aun va a durar el frio +21/3/20 23:45 - Beatriz: Ea +21/3/20 23:46 - Beatriz: Yo aquí.... Con un gin con fresas, la calefacción a 25, una pelí que he pausado 5 veces ya y a ratos escuchando el silencio. +21/3/20 23:46 - Beatriz: Momentos de la vida🤷🏼‍♀ +21/3/20 23:46 - Beatriz: Y lo que voy a ahorrar este mes.... Acabo de pensarlo +21/3/20 23:48 - Adrian Pitu: Eso si +21/3/20 23:48 - Adrian Pitu: Momentos de la vida +21/3/20 23:50 - Beatriz: Voy a ver si termino de ver la peli +21/3/20 23:50 - Beatriz: Cuídate!!!!! +21/3/20 23:50 - Beatriz: Bona nit😘 +21/3/20 23:55 - Adrian Pitu: Igualmente +21/3/20 23:55 - Adrian Pitu: Na nit +21/3/20 23:55 - Adrian Pitu: 😘😘😘 +22/3/20 15:08 - Beatriz: Menudos pivones con los que puedes contar!!!! +Vaya tela! 😍 +22/3/20 15:08 - Adrian Pitu: Jaajaja +22/3/20 15:08 - Adrian Pitu: Bueno amigas y prima +22/3/20 15:08 - Adrian Pitu: Si me mandas el corazon +22/3/20 15:08 - Adrian Pitu: Ya sabes +22/3/20 15:08 - Adrian Pitu: En mi estado estaras +22/3/20 15:17 - Beatriz: Jajajaja +22/3/20 15:17 - Beatriz: Lo ve mi hermana y le da un patatus😂 +22/3/20 17:29 - Adrian Pitu: Era broma +22/3/20 17:29 - Adrian Pitu: Si si lo ve tu hermana y alucina +22/3/20 17:29 - Adrian Pitu: Jajaja +22/3/20 17:55 - Beatriz: 🤦🏼‍♀😂 +22/3/20 17:57 - Adrian Pitu: 🤪🤪🤪 +22/3/20 17:57 - Adrian Pitu: Va un dia menos +22/3/20 17:57 - Adrian Pitu: Venga q podemos +22/3/20 17:57 - Beatriz: Siiiii +22/3/20 17:57 - Beatriz: Uno menos! +22/3/20 17:58 - Beatriz: Yo lo cuento después de aplaudir😉 +22/3/20 17:59 - Adrian Pitu: Eso si +22/3/20 17:59 - Adrian Pitu: Tienes razon +25/3/20 13:29 - Adrian Pitu: Buenos dias señorita +25/3/20 13:29 - Adrian Pitu: Como ha empezado la semana? +25/3/20 13:49 - Beatriz: Buenos días agente! +25/3/20 13:49 - Beatriz: Bien, trabajando +25/3/20 13:50 - Beatriz: Ya se que la noche un servicio tranquilo +25/3/20 13:50 - Beatriz: Y también lo de tu jefe😟 +25/3/20 13:50 - Adrian Pitu: Siii +25/3/20 13:50 - Adrian Pitu: Como lo sabes ehhh +25/3/20 13:50 - Adrian Pitu: Ya sabes con quien estoy +25/3/20 13:50 - Adrian Pitu: 🤗🤗🤗 +25/3/20 13:51 - Adrian Pitu: Lo de mi jefe sin comentarios +25/3/20 13:51 - Adrian Pitu: El trabajo bien? +25/3/20 13:56 - Beatriz: ‎IMG-20200325-WA0042.jpg (archivo adjunto) +Sin parar pero sin agobios +25/3/20 13:57 - Beatriz: Acabo de hablar con mi jefa y me ha dicho que Quirón no se plantea aún ERTE ni despidos, asi que... Tranquila +25/3/20 13:57 - Adrian Pitu: Ya veo que sin agobios genial +25/3/20 13:57 - Adrian Pitu: Pues mira mejor +25/3/20 13:57 - Adrian Pitu: Asi no piensas en eso +25/3/20 14:01 - Beatriz: Más o menos lo tenía claro, pero siempre queda una duda logica con lo que está ocurriendo +25/3/20 14:02 - Adrian Pitu: Claro claro y mas ahora +25/3/20 14:02 - Adrian Pitu: Pero mejor asi en ese tema no piensas +25/3/20 14:02 - Adrian Pitu: Porque ya de por si la cabeza no para +25/3/20 18:00 - Beatriz: 👏🏻👏🏻👏🏻👏🏻👏🏻 +25/3/20 18:00 - Beatriz: Ese bebé eres tú??? +25/3/20 18:03 - Adrian Pitu: Menosmal q se escucha algo bueno +25/3/20 18:03 - Adrian Pitu: Siiii +25/3/20 19:30 - Adrian Pitu: Me queda bien la foto no? +25/3/20 19:57 - Beatriz: Siiiiii +26/3/20 11:49 - Beatriz: En el coche patrulla??? 💃🏼🕺🏽 +26/3/20 12:05 - Adrian Pitu: Buenos dias +26/3/20 12:05 - Adrian Pitu: Siii en el coche patrulla +26/3/20 12:06 - Adrian Pitu: Asi tu hermana va contenta +26/3/20 12:11 - Beatriz: Que bien lo montais! +26/3/20 15:39 - Adrian Pitu: A tu hermana la cuido mucho +26/3/20 15:39 - Adrian Pitu: Le pongo buena musica +26/3/20 15:39 - Adrian Pitu: Para que se me anime +26/3/20 15:39 - Adrian Pitu: Que a veces la veo plof +26/3/20 17:59 - Beatriz: Ya... +26/3/20 17:59 - Beatriz: Tenemos a un tío grave... Lo sabías? +26/3/20 18:21 - Beatriz: Gracias! 🥰 +26/3/20 18:27 - Adrian Pitu: Si +26/3/20 18:27 - Adrian Pitu: Me lo comento hace dos dias +26/3/20 18:27 - Adrian Pitu: Y bueno dentro de lo que cabe +26/3/20 18:28 - Adrian Pitu: Le hago mas amena la noche y asi no piensa +26/3/20 18:34 - Beatriz: Que majo eres! 😍 +26/3/20 19:08 - Adrian Pitu: Ya son casi catorce años q conozco a tu hermana +26/3/20 19:08 - Adrian Pitu: Hemos pasado muchas historias laboralmente +26/3/20 19:08 - Adrian Pitu: Y como no la tengo q cuidar +26/3/20 19:09 - Adrian Pitu: 🤗🤗 +26/3/20 19:09 - Adrian Pitu: Para los buenos y malos momentos +26/3/20 19:12 - Beatriz: Ese apunte.... Jajajaja +26/3/20 19:12 - Beatriz: Hay compañeros de trabajo que rebasan ese título. Afortunadamente, yo tb tengo un par +26/3/20 19:19 - Adrian Pitu: Siiiii +26/3/20 19:19 - Adrian Pitu: Pues genial la verdad q cuentes con compis asi +26/3/20 19:19 - Adrian Pitu: La verdad +26/3/20 19:19 - Adrian Pitu: Son pilares fundamentales laboralmente hablando +26/3/20 19:27 - Beatriz: Si, lo son +26/3/20 19:27 - Beatriz: Hacen que hacer lo que te gusta, guste más +27/3/20 14:11 - Beatriz: 😔 🖤 +27/3/20 14:12 - Adrian Pitu: Buenos dias, como estas? +27/3/20 19:31 - Beatriz: Adrián +27/3/20 19:31 - Beatriz: Tanto whats.... +27/3/20 19:31 - Beatriz: Se me habían quedado 3 chats abajo +27/3/20 19:31 - Beatriz: Perdóname +27/3/20 19:31 - Beatriz: Bien... De finde😂 +27/3/20 19:33 - Beatriz: Tu bien? +27/3/20 19:39 - Adrian Pitu: No pasa nada +27/3/20 19:39 - Adrian Pitu: Estaba ya en el olvido de tu wassap +27/3/20 19:39 - Adrian Pitu: Jejeje +27/3/20 19:39 - Adrian Pitu: Ya de finde no? +27/3/20 19:39 - Adrian Pitu: Que bien que envidia +27/3/20 19:39 - Adrian Pitu: 😬 +27/3/20 19:39 - Adrian Pitu: Yo haciendo deporte en casa un rato hasta q salga a aplaudir +27/3/20 19:50 - Beatriz: Si... No se si ir al Carmen, a Cánovas que está de moda ahora o al cine +27/3/20 19:51 - Beatriz: Jajajs +27/3/20 19:52 - Adrian Pitu: Pues a canovas +27/3/20 19:52 - Adrian Pitu: Te lo recomiendo +27/3/20 19:52 - Adrian Pitu: 😬 +27/3/20 19:54 - Beatriz: Jajaja +27/3/20 19:54 - Beatriz: Aaaay +27/3/20 19:54 - Beatriz: Ojalá +27/3/20 20:07 - Adrian Pitu: Ya ves +27/3/20 20:07 - Adrian Pitu: Aprovecha y sales +27/3/20 20:07 - Adrian Pitu: Yo me voy a trabajar +27/3/20 20:08 - Adrian Pitu: Tomate un cubata a mi salud +27/3/20 20:26 - Beatriz: No que me detienen +27/3/20 20:26 - Beatriz: Además.... No hay quien me acompañe🤷🏼‍♀ +27/3/20 20:26 - Beatriz: Me quedo en casa viendo una peli mejor🤭 +27/3/20 20:26 - Beatriz: No te digo que no.... Que es viernes! +27/3/20 20:32 - Adrian Pitu: Yo te puedo detener +27/3/20 20:32 - Adrian Pitu: Jajaja +27/3/20 20:32 - Adrian Pitu: Donde mejor +27/3/20 20:52 - Beatriz: JAJAJA +27/3/20 20:57 - Adrian Pitu: Ya me diras que peliculon ves esta noche +27/3/20 20:57 - Adrian Pitu: 🙄 +27/3/20 21:01 - Beatriz: Tengo una oferta tan amplia, que es fácil que eligiendo me duerma😂 +27/3/20 21:05 - Adrian Pitu: Jajajaja +27/3/20 21:05 - Adrian Pitu: Pues seguramente +27/3/20 21:13 - Adrian Pitu: Mejor plan que llego seguro +27/3/20 21:15 - Beatriz: Bueno +27/3/20 21:15 - Beatriz: Yo iba para picoleta +27/3/20 21:15 - Beatriz: Me encantaría estar haciendo lo que vosotros, te lo prometo +27/3/20 21:47 - Adrian Pitu: Si? +27/3/20 21:47 - Adrian Pitu: Pues oye te puedes venir +27/3/20 21:47 - Adrian Pitu: Vas detras con nosotros +27/3/20 21:47 - Adrian Pitu: Que llevamos los cristales tintados +27/3/20 21:48 - Beatriz: Ojalá +27/3/20 21:49 - Beatriz: Pero yo quisiera de uniforme y trabajando +27/3/20 21:49 - Adrian Pitu: Mi prima +27/3/20 21:49 - Adrian Pitu: Ha dado positivo en coronavirus +27/3/20 21:49 - Adrian Pitu: Mira q noticia +27/3/20 21:49 - Adrian Pitu: Me han dado +27/3/20 21:49 - Beatriz: Síntomas lleves? +27/3/20 22:03 - Adrian Pitu: Pues por ahora le falta el sentido del gusto y olfato +27/3/20 22:11 - Beatriz: Será leve, ya verás +27/3/20 22:23 - Adrian Pitu: Eso espero la verdad +27/3/20 22:31 - Beatriz: Claro que sí!! +27/3/20 22:31 - Beatriz: No lo dudes😉 +27/3/20 22:31 - Beatriz: Ya he decidido película +27/3/20 22:31 - Beatriz: Ratatouille! +27/3/20 22:32 - Beatriz: ☺ +27/3/20 23:03 - Adrian Pitu: Peliculon +27/3/20 23:03 - Adrian Pitu: Jejejej +27/3/20 23:03 - Adrian Pitu: Te vas a dormir y lo sabes +27/3/20 23:04 - Beatriz: Probablemente! +27/3/20 23:04 - Beatriz: Tu no!!! +27/3/20 23:04 - Beatriz: Jajajaja +27/3/20 23:04 - Beatriz: Que tienes que cuidar la demarcación y a mi hermana sobre todo!!! +27/3/20 23:04 - Adrian Pitu: Yo no +27/3/20 23:05 - Adrian Pitu: Yo las ocho horas es cuidar a tu hermana +27/3/20 23:05 - Adrian Pitu: Ya lo demas viene solo +27/3/20 23:05 - Beatriz: Así me gusta! +27/3/20 23:05 - Beatriz: Cuando me vaya a dormir le mando un beso! +27/3/20 23:06 - Adrian Pitu: Se alegrara ya lo veras +27/3/20 23:06 - Beatriz: Lo sé! +27/3/20 23:06 - Adrian Pitu: Ahora nos haremos una foto los dos +27/3/20 23:07 - Adrian Pitu: Con la equipacion +27/3/20 23:07 - Adrian Pitu: Contra el coronavirus +27/3/20 23:22 - Beatriz: Que me la envíe +27/3/20 23:23 - Adrian Pitu: Se lo dire +27/3/20 23:23 - Adrian Pitu: Ahora no para con el wassap +27/3/20 23:23 - Adrian Pitu: 🙄 +27/3/20 23:24 - Beatriz: Ya.... +27/3/20 23:26 - Adrian Pitu: En nada +27/3/20 23:26 - Adrian Pitu: Hacemos la foto +27/3/20 23:30 - Adrian Pitu: Escribile a tu hermana +27/3/20 23:30 - Adrian Pitu: Y le pides la foto +27/3/20 23:30 - Adrian Pitu: 🙄 +28/3/20 0:41 - Adrian Pitu: Salimos bien no? +28/3/20 0:41 - Adrian Pitu: 😬 +28/3/20 1:02 - Beatriz: Siiiii +28/3/20 1:02 - Beatriz: Muy guapos!!! +28/3/20 1:03 - Adrian Pitu: Gracias +28/3/20 1:03 - Adrian Pitu: 🤗🤗🤗🤗 +28/3/20 1:03 - Adrian Pitu: Y por cierto +28/3/20 1:03 - Adrian Pitu: Que cuido a tu hermana muy bien +28/3/20 1:22 - Beatriz: 🤗😘 +28/3/20 1:23 - Adrian Pitu: 😘 +28/3/20 19:53 - Adrian Pitu: Viva 🇪🇸 +28/3/20 20:11 - Beatriz: Viva! Una! Única! +28/3/20 23:57 - Adrian Pitu: +Sufriendo.. +29/3/20 0:03 - Beatriz: Pobrets!!!! +29/3/20 0:03 - Beatriz: ‎IMG-20190314-WA0092.jpg (archivo adjunto) +29/3/20 0:03 - Beatriz: Yo acabo de sufrir esto🤭 +29/3/20 0:04 - Adrian Pitu: Joer +29/3/20 0:04 - Adrian Pitu: Eso es sufrir si +29/3/20 0:04 - Adrian Pitu: Te lo noto +29/3/20 0:05 - Beatriz: Lo peor es sacarme el pelo ahora🤦🏼‍♀ +29/3/20 0:07 - Adrian Pitu: Divertido +29/3/20 0:07 - Adrian Pitu: Ves eso no me pasa a mi +29/3/20 0:08 - Adrian Pitu: 😬 +29/3/20 0:10 - Beatriz: 😂😂😂😂 +29/3/20 0:10 - Beatriz: La contrapartida es no tener que afeitarme🤷🏼‍♀ +29/3/20 0:11 - Adrian Pitu: Eso es verdad +29/3/20 0:12 - Adrian Pitu: Aunq solo me recorto la barba +29/3/20 0:12 - Adrian Pitu: Pero bueno algo de tiempo me cuesta +29/3/20 0:14 - Beatriz: Merece la pena por los 30 minutos a remojo con agua humeante con sales, velas, gin y musica... 🤤 +29/3/20 0:15 - Adrian Pitu: Gintonic? +29/3/20 0:15 - Adrian Pitu: Claro q merece la pena +29/3/20 0:15 - Adrian Pitu: Vamos donde hay q firmar +29/3/20 0:15 - Beatriz: Si, Rosa con fresas +29/3/20 0:15 - Adrian Pitu: 📝 +29/3/20 0:16 - Adrian Pitu: Dios mio +29/3/20 0:16 - Adrian Pitu: Puerto de indias +29/3/20 0:16 - Adrian Pitu: Me encanta +29/3/20 0:16 - Adrian Pitu: 😔 +29/3/20 0:17 - Beatriz: Ains... +29/3/20 0:18 - Beatriz: Hago esto porque estoy recluida, si pudiera estaría ahí, al pie del cañon con mi uniforme +29/3/20 0:18 - Adrian Pitu: +29/3/20 0:19 - Beatriz: Estáis de servicio???? 🤔 +29/3/20 0:19 - Adrian Pitu: Si +29/3/20 0:19 - Adrian Pitu: Pero eso es de mi casa +29/3/20 0:19 - Adrian Pitu: La foto +29/3/20 0:20 - Beatriz: Aaaah +29/3/20 0:20 - Beatriz: Tpc te lo montas mal... +29/3/20 0:21 - Adrian Pitu: La semana pasada +29/3/20 0:21 - Adrian Pitu: Estaba modo que tomo +29/3/20 0:21 - Adrian Pitu: Pues un cubata +29/3/20 0:27 - Beatriz: Pues... Genial!!!! +29/3/20 0:30 - Adrian Pitu: Mañana paso al vino +29/3/20 0:30 - Adrian Pitu: Para comer +29/3/20 0:30 - Adrian Pitu: Un vaso +29/3/20 0:31 - Beatriz: Yo también! +29/3/20 0:31 - Beatriz: Mañana haré lasaña de verduras +29/3/20 0:31 - Adrian Pitu: Buen plato +29/3/20 0:31 - Beatriz: 🥰 +29/3/20 0:34 - Adrian Pitu: Hoy estamos contentos +29/3/20 0:34 - Adrian Pitu: Que trabajamos una hora menos +29/3/20 0:51 - Beatriz: 👏🏻👏🏻👏🏻 +29/3/20 16:05 - Beatriz: 😳🤩 +29/3/20 16:32 - Adrian Pitu: Operacion verano +29/3/20 16:32 - Adrian Pitu: 😏 +29/3/20 17:54 - Beatriz: Jo... 🤐 +29/3/20 19:25 - Adrian Pitu: Luego ha caido esto a la vuelta +29/3/20 19:25 - Adrian Pitu: +29/3/20 19:31 - Beatriz: Vaya!!! Que bien.... +30/3/20 10:27 - Beatriz: Bon día! +Al hospital? Como esta tu prima? +30/3/20 10:37 - Adrian Pitu: Buenos dias señorita +30/3/20 10:37 - Adrian Pitu: Si tenia la prueba del virus +30/3/20 10:38 - Adrian Pitu: Hasta pasado un dia no me dicen resultados +30/3/20 10:38 - Adrian Pitu: Mi prima ayer seguia igual y hoy aun no se nada de ella +30/3/20 10:39 - Beatriz: No creo que lo tengas, y si lo tienes.... Será que eres de los asintomáticos. Mejor! +30/3/20 10:39 - Beatriz: En casa? +30/3/20 10:41 - Adrian Pitu: En un dia saldre de dudas +30/3/20 10:41 - Adrian Pitu: Por ahora si +30/3/20 10:41 - Adrian Pitu: Bueno como empieza la semana? +30/3/20 10:54 - Beatriz: ‎IMG-20200330-WA0007.jpg (archivo adjunto) +Pues... Así🤷🏼‍♀ +30/3/20 13:23 - Adrian Pitu: Estas muy entretenida por lo que veo +30/3/20 13:23 - Adrian Pitu: 😬 +30/3/20 13:33 - Beatriz: Siiii +30/3/20 13:34 - Beatriz: Sumale esto.... Que el padre de mis hijos no se aclara y aquí estamos de FaceTime con los iPad🤦🏼‍♀ +30/3/20 13:34 - Beatriz: ‎IMG-20200330-WA0020.jpg (archivo adjunto) +30/3/20 13:35 - Beatriz: ‎IMG-20200330-WA0028.jpg (archivo adjunto) +30/3/20 13:35 - Beatriz: Locura máxima!!!! +30/3/20 13:46 - Adrian Pitu: Madremia +30/3/20 13:46 - Adrian Pitu: Mas entretenida todavia +30/3/20 13:47 - Adrian Pitu: No te aburres no +30/3/20 13:47 - Adrian Pitu: Te falta otro ordenador mas +30/3/20 13:47 - Adrian Pitu: 😬 +30/3/20 13:47 - Beatriz: Nooooo +30/3/20 13:48 - Beatriz: Tengo mi móvil y el de Quirón +30/3/20 13:48 - Beatriz: Ya va bien +30/3/20 13:48 - Beatriz: Dos manos y un cerebro +30/3/20 13:48 - Beatriz: Jajajaja +30/3/20 13:48 - Beatriz: Así de me olvida hasta comer!!!! +30/3/20 14:05 - Adrian Pitu: Vamos asi estas entretenida +30/3/20 14:05 - Adrian Pitu: Vaya +30/3/20 14:05 - Adrian Pitu: Se te psa el tiempo volando +30/3/20 14:06 - Adrian Pitu: Yo ya empiezo nuevo confinamiento en casa sin salir +30/3/20 14:06 - Adrian Pitu: Con lo nervio q soy +30/3/20 14:07 - Beatriz: Algo se te ocurrirá, seguro +30/3/20 14:07 - Beatriz: Tienes piscina y espacio abierto!!! Privilegiado. +30/3/20 14:08 - Adrian Pitu: Ya veremos +30/3/20 14:08 - Adrian Pitu: Con los dias que hacen +30/3/20 14:08 - Adrian Pitu: Que dan lluvias +30/3/20 14:09 - Adrian Pitu: No me podre escapar a tomar el sol +30/3/20 14:09 - Adrian Pitu: 😔 +30/3/20 14:09 - Beatriz: Eso no +30/3/20 22:08 - Adrian Pitu: Como van esas manos y ese cerebro? +30/3/20 22:29 - Beatriz: ‎IMG-20200330-WA0114.jpg (archivo adjunto) +O hacer rabiar a esta.... +30/3/20 22:30 - Beatriz: ‎IMG-20200330-WA0118.jpg (archivo adjunto) +Le encanta posar!!! 😂 +30/3/20 22:30 - Adrian Pitu: Anda que bonica es +30/3/20 22:30 - Adrian Pitu: Hazle rabiar si +30/3/20 22:30 - Adrian Pitu: Que se ve muy tranquila +30/3/20 22:31 - Beatriz: Esta loca +30/3/20 22:31 - Beatriz: Tiene 7'5 meses +30/3/20 22:31 - Beatriz: Nació el mismo día que yo, pero de 2019 +30/3/20 22:37 - Adrian Pitu: Madremia +30/3/20 22:37 - Adrian Pitu: Superjoven +30/3/20 22:37 - Adrian Pitu: No parara +30/3/20 22:38 - Beatriz: Ya +30/3/20 22:39 - Beatriz: Voy a hacerme unas fresas con nata o un sándwich de Nocilla. +Mañana ya hago por quemarlo🙄 +30/3/20 22:40 - Adrian Pitu: Anda +30/3/20 22:40 - Adrian Pitu: Mañana vamos +30/3/20 22:40 - Adrian Pitu: Tiene que echar humo esa cinta que tienes en la terraza +30/3/20 22:40 - Adrian Pitu: Jajajaj +30/3/20 22:40 - Adrian Pitu: Pero oye te apoyo en eso +30/3/20 22:40 - Adrian Pitu: 😏 +30/3/20 22:46 - Beatriz: Gracias! 🤗 +30/3/20 22:57 - Adrian Pitu: Yo voto por fresas con nata +30/3/20 23:01 - Beatriz: Acertaste! +30/3/20 23:02 - Beatriz: ‎IMG-20200330-WA0125.jpg (archivo adjunto) +Ya no queda +30/3/20 23:04 - Adrian Pitu: Biennn +30/3/20 23:04 - Adrian Pitu: He acertado +30/3/20 23:04 - Adrian Pitu: Ya veo ya +30/3/20 23:04 - Adrian Pitu: No has dejado nada +30/3/20 23:05 - Beatriz: Aun haré otro viaje a la cocina... Ya veras +30/3/20 23:06 - Adrian Pitu: Jajajjaja +30/3/20 23:06 - Adrian Pitu: Para recargar? +30/3/20 23:06 - Beatriz: Oui +30/3/20 23:10 - Adrian Pitu: Lo veo +30/3/20 23:10 - Adrian Pitu: 🙄 +30/3/20 23:57 - Adrian Pitu: Han caido mas fresas? +30/3/20 23:57 - Beatriz: Jajaja +30/3/20 23:58 - Beatriz: Noooo +30/3/20 23:58 - Beatriz: He pensado y he llegado a la conclusión de que mejor mañana.... +30/3/20 23:59 - Adrian Pitu: Jajaja +30/3/20 23:59 - Adrian Pitu: Bueno has hecho bien +30/3/20 23:59 - Adrian Pitu: Fuerza de voluntad +31/3/20 0:02 - Beatriz: Ay! +31/3/20 12:08 - Beatriz: Bon día agente! +31/3/20 12:08 - Beatriz: Sabes ya resultado? +31/3/20 12:16 - Adrian Pitu: Buenos dias señorita +31/3/20 12:16 - Adrian Pitu: Aun no se nada +31/3/20 12:16 - Adrian Pitu: Por ahora han llamdo a tres compañeros y han salido negativo +31/3/20 12:19 - Beatriz: Seguro que en tu caso es negativo también🤗 +31/3/20 12:26 - Adrian Pitu: Eso espero +31/3/20 12:27 - Adrian Pitu: Quiero seguir trabajando y ayudando +31/3/20 12:34 - Adrian Pitu: Ya ha dado un compi positivo +31/3/20 12:34 - Adrian Pitu: Por ahora cinco compis mas han dado negativo +31/3/20 13:03 - Beatriz: Síntomas leves, entiendo... +Pero claro, lo saca del campo de batalla +31/3/20 13:18 - Adrian Pitu: Ya se el resultado +31/3/20 13:18 - Adrian Pitu: NEGATIVO +31/3/20 13:21 - Beatriz: Me alegro mucho!!!! 👏🏻👏🏻👏🏻 +31/3/20 13:21 - Beatriz: A seguir trabajando +31/3/20 13:22 - Adrian Pitu: Siii +31/3/20 13:22 - Beatriz: Y siendo positiva, si tu das negativo.... Entiendo que mi hermana también dará negativo... +31/3/20 13:22 - Adrian Pitu: Gracias por tu apoyo +31/3/20 13:22 - Adrian Pitu: Seguro q si +31/3/20 13:22 - Beatriz: +31/3/20 13:22 - Adrian Pitu: Tu hermana dara como yo +31/3/20 13:22 - Adrian Pitu: Va mañana ella +31/3/20 13:22 - Adrian Pitu: A la pruba +31/3/20 13:25 - Beatriz: Lo se +31/3/20 13:25 - Beatriz: Nos ha dicho lo del positivo y 5 negativos +31/3/20 13:26 - Beatriz: yo no he dicho que ya lo sabía🙄🤭 +31/3/20 13:26 - Adrian Pitu: Me imagino +31/3/20 13:26 - Adrian Pitu: Pues ese negativo yo +31/3/20 13:26 - Beatriz: 😂 +31/3/20 13:26 - Adrian Pitu: 🤗🤗🤗🤗 +31/3/20 13:26 - Beatriz: 💪🏻 +31/3/20 13:26 - Beatriz: Que alivio, verdad? +31/3/20 13:26 - Beatriz: Y tu prima? +31/3/20 13:27 - Adrian Pitu: Un alivio si +31/3/20 13:27 - Adrian Pitu: Mi prima ya mejorando a dia de hoy +31/3/20 13:27 - Adrian Pitu: Y tu tio como va? +31/3/20 13:27 - Adrian Pitu: Que ayer no te pregunte +31/3/20 13:27 - Beatriz: Mira +31/3/20 13:27 - Beatriz: A mi padre le han tenido q hacer esta mñna una traqueotomia, acaban de llamarnos q ha salido bien, y q le han bajado un poco la sedación a ver como evoluciona🙏🙏🙏🙏🙏 +31/3/20 13:27 - Beatriz: Acaba de escribirnos mi prima +31/3/20 13:28 - Adrian Pitu: Bueno buena señal +31/3/20 13:28 - Adrian Pitu: Vaya tela +31/3/20 13:28 - Beatriz: Pffff +31/3/20 13:28 - Adrian Pitu: Que vaya poco a poco evolucionando +31/3/20 13:28 - Beatriz: Yo es que, en Dios no creo demasiado +31/3/20 13:28 - Adrian Pitu: De verdad q dias +31/3/20 13:28 - Adrian Pitu: Ni yo +31/3/20 13:28 - Adrian Pitu: Pero hay q creer +31/3/20 13:28 - Beatriz: Si en la labor de médicos y la fuerza de cada uno +31/3/20 13:28 - Adrian Pitu: Y ser positivos +31/3/20 13:29 - Beatriz: Creo en la confianza, no en la esperanza +31/3/20 13:29 - Adrian Pitu: Ya +31/3/20 13:29 - Adrian Pitu: Es mitad y mitad +31/3/20 13:29 - Adrian Pitu: La labor de los medicos +31/3/20 13:29 - Adrian Pitu: Y la fuerza de voluntad de cada uno +31/3/20 13:29 - Beatriz: La Esperanza es como un quizás +La confianza es, se que lo conseguirás +31/3/20 13:30 - Beatriz: Soy la rarita de la familia en esto... Demasiado realista. +31/3/20 13:31 - Adrian Pitu: Bueno pues +31/3/20 13:31 - Adrian Pitu: Tu tio saldra +31/3/20 13:31 - Adrian Pitu: Ya lo veras +31/3/20 13:32 - Adrian Pitu: Tiene q seguir luchando +31/3/20 13:46 - Beatriz: Si +31/3/20 13:46 - Adrian Pitu: Tu como esta animicamente +31/3/20 13:46 - Adrian Pitu: ? +31/3/20 13:48 - Beatriz: Bien! +31/3/20 13:48 - Beatriz: Me siento inútil... +31/3/20 13:48 - Beatriz: Pero bien +31/3/20 13:48 - Adrian Pitu: No digas eso +31/3/20 13:48 - Adrian Pitu: Anda +31/3/20 13:48 - Beatriz: Es verdad! +31/3/20 13:48 - Adrian Pitu: Aunq lo sientas +31/3/20 13:49 - Beatriz: Estaba pensando decirle al Director que me iba de refuerzo a las recepciones. +Esto es lo que siento, puede parecer ridículo, pero... +31/3/20 13:50 - Beatriz: Es lo que siento, sinceramente +31/3/20 13:51 - Beatriz: Que buen resultado pese a ser, negativo 💪🏻👏🏻👏🏻👏🏻 +31/3/20 13:55 - Adrian Pitu: Ya +31/3/20 13:55 - Adrian Pitu: Te entiendo que en casa +31/3/20 13:55 - Adrian Pitu: Lo mismo me pasa a mi +31/3/20 13:56 - Adrian Pitu: Que soy mas productivo en la calle +31/3/20 13:56 - Adrian Pitu: Para mi no es ridicula tu idea +31/3/20 13:56 - Adrian Pitu: Es aportar tu granito de arena +31/3/20 14:00 - Beatriz: No me lo va a permitir.... +31/3/20 14:00 - Adrian Pitu: Bueno +31/3/20 14:01 - Adrian Pitu: Lo puedes intentar +31/3/20 14:01 - Beatriz: Al personal "crítico" Es al primero que sacó +31/3/20 14:01 - Beatriz: Si +31/3/20 14:09 - Adrian Pitu: A ver si tienes suerte +31/3/20 14:09 - Adrian Pitu: Sino en casa +31/3/20 14:09 - Adrian Pitu: Que tambien estas bien +31/3/20 14:10 - Beatriz: Si aquí trabajo, para que el hospital siga adelante.... Pero pffff.... 🥴 +31/3/20 14:11 - Adrian Pitu: Ya +31/3/20 14:12 - Adrian Pitu: Pero por otro lado estas ayudando a la humanidad +31/3/20 14:12 - Adrian Pitu: En quedarte en casa +31/3/20 14:28 - Beatriz: Si +31/3/20 14:28 - Beatriz: Bueno +31/3/20 14:28 - Beatriz: Lo se +31/3/20 14:39 - Adrian Pitu: Venga actitud positiva +31/3/20 14:39 - Adrian Pitu: Por cierto +31/3/20 14:39 - Adrian Pitu: Has quemando el postre de anoche? +31/3/20 14:40 - Beatriz: No, aun no +31/3/20 14:40 - Beatriz: Llevo desde las 10 con Quirón +31/3/20 14:42 - Beatriz: Mi plan de hoy es; +Terminar esto y con suerte he acabado hoy. +Comerme la lasaña que hice el domingo (ya que hice, para dos días) +Bailar a lo loco para calentar articulaciones. +Salir a correr a la terraza 1 horita... 7km. +31/3/20 14:42 - Beatriz: Ducha y música hasta las 20 que salga a aplaudir +31/3/20 14:42 - Beatriz: Hacer cena, cenar, ver redes y.... A dormir!!!! +31/3/20 15:08 - Adrian Pitu: Un buen cuadrante de dia +31/3/20 15:08 - Adrian Pitu: Te vendra bien esa horita en la cinta +31/3/20 15:08 - Adrian Pitu: Yo subiere y bajare escaleras +31/3/20 15:24 - Beatriz: Si, tendrás barro fuera.... +31/3/20 15:24 - Beatriz: Voy a comer, si no se me Junta con la cena🙄 +31/3/20 15:27 - Adrian Pitu: Venga a comer +31/3/20 15:27 - Adrian Pitu: Que ya es hora +31/3/20 15:27 - Adrian Pitu: 😬 +31/3/20 15:32 - Beatriz: ‎IMG-20200331-WA0076.jpg (archivo adjunto) +Mmmmm.... La hago sin Bechamel, más ligera!!!! +31/3/20 15:36 - Adrian Pitu: Que buena pinta +31/3/20 15:40 - Beatriz: Graaaaacias! +31/3/20 22:44 - Adrian Pitu: Como va tu tio? +31/3/20 22:44 - Adrian Pitu: Alguna novedad +31/3/20 22:47 - Beatriz: Hello +31/3/20 22:47 - Beatriz: Dan un parte al día, hacia el medio dia +31/3/20 22:47 - Beatriz: En este caso, la falta de noticias ya es una buena noticia +31/3/20 22:47 - Adrian Pitu: Mejor +31/3/20 22:47 - Adrian Pitu: La verdas +31/3/20 22:48 - Beatriz: Estoy intentando descargar aplicaciones en la tele del comedor +31/3/20 22:48 - Adrian Pitu: Aplicaciones piratas? +31/3/20 22:48 - Adrian Pitu: 😏 +31/3/20 22:48 - Beatriz: La de la habitación es Samsung y casi que hemos nacido sabiendo +31/3/20 22:49 - Beatriz: La del comedor es Saba y es complicado +31/3/20 22:49 - Beatriz: Noooo... Por Dios!!! +31/3/20 22:49 - Beatriz: Legales +31/3/20 22:49 - Beatriz: Tengo prime, hbo y Disney+ y no puedo ponerlas aquí.... Solo Netflix y YouTube +31/3/20 22:49 - Beatriz: No lo entiendo +31/3/20 22:50 - Beatriz: Encima me dice que no se reconoce mi mail +31/3/20 22:51 - Adrian Pitu: Seguro q lo aciertas ya lo veras +31/3/20 22:52 - Adrian Pitu: Mira algun tutorial de youtube +31/3/20 22:52 - Adrian Pitu: Eso ayuda bastante +31/3/20 23:04 - Beatriz: Voy a ver.... +31/3/20 23:05 - Beatriz: Es por los niños, la verdad +31/3/20 23:05 - Beatriz: A mi la tele me hace de somnífero +31/3/20 23:14 - Adrian Pitu: Venga q tu puedes +31/3/20 23:14 - Adrian Pitu: 💪 +31/3/20 23:19 - Beatriz: Soy cabezona +31/3/20 23:20 - Adrian Pitu: Pues venga va +31/3/20 23:20 - Adrian Pitu: Soy como tu cabezon +31/3/20 23:20 - Adrian Pitu: Asi q hasta q no lo logre +31/3/20 23:20 - Adrian Pitu: No pararas +31/3/20 23:26 - Beatriz: No, no pienso parar +31/3/20 23:26 - Beatriz: ‎IMG-20200331-WA0137.jpg (archivo adjunto) +31/3/20 23:27 - Adrian Pitu: Exacto +31/3/20 23:27 - Adrian Pitu: Tutorial de youtube +31/3/20 23:39 - Beatriz: ‎IMG-20200331-WA0141.jpg (archivo adjunto) +31/3/20 23:39 - Beatriz: Hoy si.... +31/3/20 23:39 - Beatriz: Para el desgaste mental +31/3/20 23:39 - Beatriz: Jajaja +31/3/20 23:41 - Adrian Pitu: Di que si +31/3/20 23:41 - Adrian Pitu: Q aproveche señorita +31/3/20 23:42 - Adrian Pitu: 😏 +31/3/20 23:43 - Beatriz: Gracias! 😘 +1/4/20 0:02 - Beatriz: He encontrado las instrucciones de la tv +1/4/20 0:02 - Beatriz: 🙄🤦🏼‍♀ +1/4/20 0:02 - Beatriz: Tiene las aplicaciones predeterminadas +1/4/20 0:02 - Beatriz: Por muy cabezona que sea... No me va a dar opción!!! +1/4/20 0:03 - Beatriz: Es 4k pero no me deja más app +1/4/20 0:03 - Beatriz: Ale! Me voy a la Samsung a trastear +1/4/20 0:04 - Adrian Pitu: Pues nada +1/4/20 0:04 - Adrian Pitu: A la otra tele a trastear +1/4/20 0:04 - Adrian Pitu: Ya ha caido el postre +1/4/20 0:04 - Adrian Pitu: ? +1/4/20 0:05 - Beatriz: No me considero derrotada +1/4/20 0:05 - Beatriz: Hombre!! Claro!!! +1/4/20 0:05 - Beatriz: Mientras leía las instrucciones +1/4/20 0:11 - Adrian Pitu: Pues venga al lio +1/4/20 0:11 - Adrian Pitu: No te molesto +1/4/20 0:11 - Adrian Pitu: Q me sabe mal +1/4/20 0:21 - Beatriz: Mañana te cuento! +1/4/20 0:21 - Beatriz: Bona nit!!! +1/4/20 0:21 - Adrian Pitu: Vale +1/4/20 0:21 - Adrian Pitu: Na nit +1/4/20 0:21 - Adrian Pitu: 😘😘 +1/4/20 11:59 - Beatriz: 💪🏻siempre!!! +1/4/20 12:00 - Adrian Pitu: Buenos dias señorita +1/4/20 12:00 - Adrian Pitu: Que tal? +1/4/20 12:00 - Beatriz: Bien, dejó el ordenador y esta tarde sigo. +Hoy puedo hacer más cosas +1/4/20 12:01 - Beatriz: Me he puesto vaqueros y botas y he bajado la basura!!💃🏼 +1/4/20 12:03 - Adrian Pitu: Anda muy bien +1/4/20 12:03 - Adrian Pitu: Voy hoy puedes salir a tomar algo el sol +1/4/20 12:03 - Adrian Pitu: Al balcon +1/4/20 12:03 - Adrian Pitu: Como va tu tio? +1/4/20 12:11 - Beatriz: En 10' +1/4/20 12:11 - Beatriz: En una hora y media o así sabremos +1/4/20 12:13 - Adrian Pitu: Q control de tiempo +1/4/20 12:13 - Adrian Pitu: Bueno luego te pregunto +1/4/20 12:15 - Beatriz: 😏 +1/4/20 18:17 - Adrian Pitu: Buenas tardes señorita +1/4/20 18:18 - Adrian Pitu: Ya sabes algo de tu tio? +1/4/20 18:41 - Beatriz: Hello +1/4/20 18:41 - Beatriz: Grave, pero dentro de ello parece que responde a ttmto +1/4/20 18:42 - Beatriz: Han advertido de que es todo incierto, puede mejorar 3 días y empeorar de repente +1/4/20 18:42 - Adrian Pitu: Bueno mientras que vaya respondiendo +1/4/20 18:42 - Adrian Pitu: No esta mal +1/4/20 18:42 - Adrian Pitu: Asi ya mal panorama +1/4/20 18:43 - Beatriz: Claro +1/4/20 18:43 - Beatriz: Si es que no saben por donde va esto... No hay un mapa aun +1/4/20 18:43 - Beatriz: Me harán a mediados de abril la prueba de sangre +1/4/20 18:44 - Beatriz: Llegaran entre el 10/12 a Valencia +1/4/20 18:45 - Adrian Pitu: Madremia +1/4/20 18:45 - Adrian Pitu: Aun quedan dias +1/4/20 18:45 - Adrian Pitu: Ya me imagino +1/4/20 18:46 - Beatriz: Si +1/4/20 18:47 - Adrian Pitu: Pues nada paciencia +1/4/20 18:47 - Adrian Pitu: Si pasaran los dias mas rapido +1/4/20 18:47 - Adrian Pitu: Pero madremia que lentitud +1/4/20 18:48 - Beatriz: Nos queda mili amigo +1/4/20 18:48 - Beatriz: Empezaremos a "circular" En mayo, después del 2 +1/4/20 18:48 - Beatriz: Con restricciones, claro +1/4/20 18:49 - Beatriz: Y no todo el mando +1/4/20 18:49 - Beatriz: Mundo +1/4/20 18:50 - Adrian Pitu: Ya ya +1/4/20 18:50 - Adrian Pitu: Aun queda si +1/4/20 18:51 - Adrian Pitu: Iremos a cuenta gotas saliendo a la calle +1/4/20 18:57 - Beatriz: Te han mandado el meme de la canción de Camela? +1/4/20 18:58 - Adrian Pitu: Nooo +1/4/20 18:59 - Beatriz: Voy +1/4/20 18:59 - Beatriz: +1/4/20 18:59 - Adrian Pitu: Ahhh si +1/4/20 18:59 - Adrian Pitu: Pensaba q era otro +1/4/20 18:59 - Beatriz: Pues eso! +1/4/20 18:59 - Adrian Pitu: Perdona +1/4/20 19:00 - Beatriz: Los bares van a ser los primeros en recuperar pasta +1/4/20 19:00 - Adrian Pitu: Y tanto +1/4/20 19:00 - Adrian Pitu: Estoy por montarme uno +1/4/20 19:00 - Adrian Pitu: Jajaja +1/4/20 19:00 - Beatriz: Jsjsjs +1/4/20 19:00 - Beatriz: Igual ahora lo tienes chungo con los permisos +1/4/20 19:00 - Beatriz: Y la poli esta ojo avizor con todo +1/4/20 19:00 - Beatriz: Cuidadin! 😂 +1/4/20 19:01 - Adrian Pitu: Jajajjaa +1/4/20 19:01 - Adrian Pitu: Era broma +1/4/20 19:01 - Adrian Pitu: Ya con mi trabajo bastante +1/4/20 19:01 - Beatriz: Podrías hacer la vista gorda, desde luego +1/4/20 19:01 - Beatriz: Jajaja +1/4/20 19:02 - Adrian Pitu: Si si eso si +1/4/20 22:10 - Adrian Pitu: +Te queremos.pdf.pdf.pdf +1/4/20 22:12 - Beatriz: JAJAJAJA +1/4/20 22:12 - Beatriz: Que bueno! +1/4/20 22:12 - Adrian Pitu: Es muy bueno +1/4/20 22:12 - Adrian Pitu: Jajaja +1/4/20 22:13 - Adrian Pitu: Motivador sobretodo +2/4/20 15:14 - Adrian Pitu: Tu hermana ha dado negativo en el test +2/4/20 15:14 - Adrian Pitu: Que fuerte esta +2/4/20 15:14 - Adrian Pitu: 💪 +3/4/20 13:37 - Beatriz: Siiiiii +3/4/20 13:38 - Beatriz: Te me habias quedado ahí abajo del Whats😬sorry. +Esta semana mucho trabajo y muchos deberes por face time con mis hijos +3/4/20 13:38 - Beatriz: Tu prima va bien? +3/4/20 13:38 - Beatriz: Tu bien? +3/4/20 13:38 - Beatriz: Por cierto! Buenos días!!!! +3/4/20 14:38 - Adrian Pitu: No te preocupes +3/4/20 14:38 - Adrian Pitu: Te entiendo +3/4/20 14:38 - Adrian Pitu: Si mi prima ya poco a poco mejor +3/4/20 14:38 - Adrian Pitu: Yo bien con ganas de trabajar ya sabes +3/4/20 14:39 - Adrian Pitu: Como va tu tio? +3/4/20 14:47 - Beatriz: Me alegro!!! +3/4/20 14:47 - Beatriz: Y yo.... Hoy me han llamado y el 10 posiblemente me incorpore a ratos. El lunes concretar emos. +3/4/20 14:48 - Beatriz: Sedado pero respondiendo a medicación🥰 +3/4/20 14:57 - Adrian Pitu: Genial entonces +3/4/20 14:57 - Adrian Pitu: Venga q ya te queda menos +3/4/20 14:57 - Adrian Pitu: Para ir a trabajar +3/4/20 14:57 - Adrian Pitu: Y ayudar +3/4/20 14:57 - Beatriz: Yes!!! +3/4/20 14:58 - Adrian Pitu: Venga q ya es viernes +3/4/20 15:10 - Beatriz: Wooooow!!! 😂 +3/4/20 15:10 - Adrian Pitu: Jajjaja +3/4/20 15:10 - Adrian Pitu: Esta noche donde vamos +3/4/20 15:10 - Adrian Pitu: Ruzafa? +3/4/20 15:14 - Beatriz: O Carmen, por variar!!!! +3/4/20 15:15 - Adrian Pitu: Vale +3/4/20 15:15 - Adrian Pitu: Al carmen +3/4/20 15:15 - Adrian Pitu: Ya esta +3/4/20 15:16 - Beatriz: Cena o cena y copa? +3/4/20 15:17 - Adrian Pitu: Cena y copa +3/4/20 15:17 - Adrian Pitu: Mejor asi +3/4/20 15:18 - Beatriz: Hecho +3/4/20 15:18 - Beatriz: 😉 +3/4/20 15:22 - Adrian Pitu: Puerto de indias +3/4/20 15:23 - Adrian Pitu: Esa es la copa +3/4/20 15:23 - Adrian Pitu: Que tomaremos no? +3/4/20 22:29 - Adrian Pitu: No te veo por el Carmen +3/4/20 22:29 - Adrian Pitu: 🤔 +3/4/20 22:34 - Beatriz: Jajaja +3/4/20 22:34 - Beatriz: Siiiii +3/4/20 22:34 - Beatriz: Estoy aquí, que me he encontrado a unos colegas +3/4/20 22:34 - Beatriz: No paro con las videollamadas y el face time +3/4/20 22:35 - Adrian Pitu: Normal +3/4/20 22:35 - Adrian Pitu: Pon a cargar movil +3/4/20 22:35 - Adrian Pitu: Y asi psa +3/4/20 22:35 - Adrian Pitu: Te escribo y estoy el ultimo +3/4/20 22:47 - Beatriz: Jsjsjs +3/4/20 22:47 - Beatriz: Ahora va mi hijo +3/4/20 22:51 - Adrian Pitu: Bueno +3/4/20 22:51 - Adrian Pitu: Tienes lista de cola +3/4/20 22:54 - Beatriz: 🤗 +5/4/20 11:03 - Beatriz: Buenos días sr. Agente +5/4/20 12:45 - Adrian Pitu: Buenos dias señorita +5/4/20 12:45 - Adrian Pitu: Como esta usted? +5/4/20 12:47 - Beatriz: Con dolor de cabeza desde ayer por la mañana +5/4/20 12:48 - Adrian Pitu: No me digas +5/4/20 12:48 - Adrian Pitu: Vaya +5/4/20 12:48 - Adrian Pitu: Te has tomado algo? +5/4/20 12:49 - Beatriz: Si +5/4/20 12:50 - Beatriz: Si, paracetamol... Pero vamos, que como si nada +5/4/20 12:50 - Beatriz: Es el confinamiento... +5/4/20 12:55 - Adrian Pitu: Ya +5/4/20 12:55 - Adrian Pitu: Ya un rollo +5/4/20 12:56 - Adrian Pitu: Yo me he venido a mi chalet +5/4/20 12:56 - Adrian Pitu: Q mi madre no ha pasado buena noche +5/4/20 12:56 - Adrian Pitu: Y estoy cuidandola +5/4/20 12:56 - Adrian Pitu: Creo q son las cervicales +5/4/20 12:56 - Adrian Pitu: He hecho videollamada con mi primo q es medico +5/4/20 12:57 - Adrian Pitu: Y bueno posiblemente no me la lleve al hospital +5/4/20 12:57 - Adrian Pitu: Asi q +5/4/20 12:59 - Beatriz: Ains.... +5/4/20 12:59 - Beatriz: Muy bien! Que suerte haberte hecho el test🙏🏻 +5/4/20 13:00 - Beatriz: Calor seco local y analgesia? +5/4/20 13:01 - Adrian Pitu: Pues si +5/4/20 13:04 - Beatriz: Tiene sensación de mareo? +5/4/20 13:03 - Adrian Pitu: Tiene fiebre +5/4/20 13:03 - Adrian Pitu: Eso si +5/4/20 13:04 - Adrian Pitu: Pero bueno la tengo en la cama tumbada +5/4/20 13:04 - Adrian Pitu: Menosmal q me he traido mascara,guantes y gafas +5/4/20 13:04 - Adrian Pitu: Si si +5/4/20 13:06 - Beatriz: Es jodido las cervicales +5/4/20 13:06 - Beatriz: En cualquier caso, si es mayor, creo que puede ir el médico casa +5/4/20 13:51 - Adrian Pitu: Si mucho +5/4/20 13:51 - Adrian Pitu: La pobre esta q no puede moverse +5/4/20 13:57 - Beatriz: Tenéis almohadilla eléctrica o bolsas de agua Caliente? Eso creo que puede ayudar +5/4/20 13:57 - Adrian Pitu: Si si +5/4/20 13:57 - Beatriz: Y de medicación imagino que tu primo os habrá dicho que puede tomar +5/4/20 13:57 - Adrian Pitu: Voy a casa y se la llevo +5/4/20 13:57 - Beatriz: Quizás Ennantyum +5/4/20 13:57 - Adrian Pitu: Si exacto +5/4/20 13:58 - Beatriz: Jolin Adrián, que mal me sabe que a esto, se le sume tener dolor de cervicales😥 +5/4/20 13:59 - Beatriz: Aunque, seguro que con tus cuidados lo lleva mejor y se recupera antes +5/4/20 13:59 - Beatriz: Ostras! Tienes más hermanos? Mañana entras de turno😕 +5/4/20 14:32 - Adrian Pitu: Eso seguro +5/4/20 14:32 - Adrian Pitu: Ya veremos como lo gestiono +5/4/20 14:32 - Adrian Pitu: Ya q mañana trabajo por la mañana +5/4/20 14:35 - Beatriz: Alguien podrá cambiarte.... +5/4/20 14:38 - Adrian Pitu: Si si +5/4/20 14:38 - Adrian Pitu: Esta situacion de crisis +5/4/20 14:38 - Adrian Pitu: La tengo bien gestionada +5/4/20 14:38 - Adrian Pitu: Un sobrino esta preparado +5/4/20 14:57 - Beatriz: Perfecto! +5/4/20 14:57 - Beatriz: Si fuera posible (y si fuera necesario ante todo) puedes contar también conmigo, de veras! +5/4/20 15:25 - Adrian Pitu: Muchas gracias de verdad +5/4/20 15:25 - Adrian Pitu: Al reves lo mismo +5/4/20 15:25 - Adrian Pitu: Que lo sepas +5/4/20 15:26 - Beatriz: Gracias🤗 +5/4/20 17:26 - Adrian Pitu: 🤗🤗🤗🤗 +5/4/20 22:21 - Beatriz: Como esta tu madre? +5/4/20 22:26 - Adrian Pitu: La tengo en casa +5/4/20 22:27 - Adrian Pitu: Me la he traido +5/4/20 22:27 - Adrian Pitu: Cuando se ponga buena la llevo con mi padre +5/4/20 22:27 - Adrian Pitu: Y asi la tengo mas controlada +5/4/20 22:31 - Beatriz: Muy bién! +5/4/20 22:31 - Beatriz: Y mañana? +5/4/20 22:33 - Adrian Pitu: Mañana viene mi sobrino a mi casa +5/4/20 22:33 - Adrian Pitu: Madrugara +5/4/20 22:33 - Adrian Pitu: Y vendra +5/4/20 22:34 - Adrian Pitu: Hasta q no llegue yo, estara con mi madre +5/4/20 22:50 - Beatriz: Bien +5/4/20 22:51 - Adrian Pitu: Por cierto +5/4/20 22:51 - Adrian Pitu: Que hoy no te he preguntado +5/4/20 22:51 - Adrian Pitu: Por tu tio +5/4/20 22:53 - Beatriz: Mi tío igual, estable dentro de la Gravedad. +Gracias por preguntar. +Me voy a dormir ya.... Si necesitas algo dímelo que tengo certificado para poder salir y no tengo problema. +Bona nit😘 +5/4/20 22:57 - Adrian Pitu: Gracias por tu apoyo,que descanses +5/4/20 22:57 - Adrian Pitu: Na nit 😘 +6/4/20 12:40 - Beatriz: Eso digo yo!!? +6/4/20 12:40 - Beatriz: Bon día! +6/4/20 12:40 - Beatriz: Y la Mami? Como se encuentra? +6/4/20 12:40 - Adrian Pitu: Buenos dias señorita +6/4/20 12:40 - Adrian Pitu: La mami sigue igual +6/4/20 12:41 - Adrian Pitu: Esta tumbada en la cama segun me ha comentado mi sobrino +6/4/20 12:41 - Adrian Pitu: Pero que va bien vamos +6/4/20 12:41 - Adrian Pitu: Gracias por preguntar +6/4/20 12:41 - Adrian Pitu: Y tu que tal? +6/4/20 12:41 - Beatriz: Bueno... Poquet a poquet.... Eso es latoso +6/4/20 12:42 - Beatriz: Bien, ya no me duele la cabeza y estoy terminando lo que había de trabajo Hoy.... Poco +6/4/20 13:09 - Adrian Pitu: Si poco a poco +6/4/20 13:09 - Adrian Pitu: Bueno mejor q no te duela la cabeza +6/4/20 13:09 - Adrian Pitu: Eso es buena señal +6/4/20 13:09 - Adrian Pitu: Tu tio como va? +6/4/20 13:10 - Beatriz: Aun no nos han dicho nada +6/4/20 20:32 - Adrian Pitu: Hola señorita +6/4/20 20:32 - Adrian Pitu: Ya sabes algo de tu tio? +6/4/20 20:44 - Beatriz: Hello +6/4/20 20:44 - Beatriz: Pues... +6/4/20 20:44 - Beatriz: Después de 11 días ingresado, ayer empezó con fiebre +6/4/20 20:44 - Beatriz: No saben de qué +6/4/20 20:46 - Adrian Pitu: No me digas +6/4/20 20:46 - Adrian Pitu: Vaya tela +6/4/20 20:49 - Beatriz: Si +6/4/20 20:49 - Beatriz: Acabamos de hacer vídeo con Arancha +6/4/20 20:50 - Adrian Pitu: Si? +6/4/20 20:50 - Beatriz: Iba de copiloto en el coche a un servicio, con todo el EPI +6/4/20 20:50 - Adrian Pitu: Cuanto tiempo sin ver a tu hermana +6/4/20 20:50 - Adrian Pitu: Si? +6/4/20 20:50 - Beatriz: Claro! +6/4/20 20:50 - Adrian Pitu: Ostia +6/4/20 20:50 - Adrian Pitu: No lo sabia +6/4/20 20:50 - Beatriz: Esta igual de guapa y dulce que siempre +6/4/20 20:50 - Beatriz: Bueno.... Guantes y máscara🤷🏼‍♀ +6/4/20 20:51 - Adrian Pitu: Eso no lo dudo +6/4/20 20:51 - Adrian Pitu: Es broma la he visto +6/4/20 20:51 - Adrian Pitu: Jajaja +6/4/20 20:51 - Adrian Pitu: Ahhh vale +6/4/20 20:52 - Beatriz: Ibas con ella? No... No? +6/4/20 20:52 - Adrian Pitu: La he visto en el cambio +6/4/20 20:52 - Adrian Pitu: Si voy con ella +6/4/20 20:52 - Adrian Pitu: Me hubieras visto +6/4/20 20:53 - Beatriz: Conducías tu cuando hablaba? +6/4/20 20:54 - Adrian Pitu: No +6/4/20 20:54 - Adrian Pitu: Estoy de mañanas +6/4/20 20:54 - Adrian Pitu: Y ella de tarde +6/4/20 20:54 - Beatriz: Ah! +6/4/20 20:54 - Adrian Pitu: No era yo no +6/4/20 20:54 - Beatriz: Que lío!!! +6/4/20 20:56 - Adrian Pitu: Jajajp +6/4/20 20:56 - Adrian Pitu: No te me aclaras +6/4/20 20:57 - Adrian Pitu: Si estuviera con ella +6/4/20 20:57 - Adrian Pitu: En la videollamada me hubieras visto +6/4/20 20:57 - Adrian Pitu: Sabes +6/4/20 21:03 - Beatriz: No, no hemos visto a su acompañante +6/4/20 21:14 - Adrian Pitu: Ya +6/4/20 21:14 - Adrian Pitu: Pues no se ha puesto +6/4/20 21:14 - Adrian Pitu: Es este espera +6/4/20 21:16 - Adrian Pitu: +6/4/20 22:02 - Beatriz: Bonito equipo! +La más guapa, mi hermana Pitu😍 +6/4/20 22:18 - Adrian Pitu: Que vas a decir +6/4/20 22:18 - Adrian Pitu: De tu hermana +6/4/20 22:18 - Adrian Pitu: La mejor +6/4/20 22:18 - Adrian Pitu: 😏 +6/4/20 22:22 - Beatriz: Mi chica! +6/4/20 22:31 - Adrian Pitu: Mi protegida! +6/4/20 22:34 - Beatriz: 🥰 +6/4/20 22:35 - Beatriz: Sabes que la llamamos Pitu, verdad? +6/4/20 22:35 - Beatriz: Por cierto! Te iba a preguntar antes y las vídeo de la noche y hacerme la súper cena, se me ha ido el Santo al cielo +6/4/20 22:35 - Beatriz: Y tu Mami? +6/4/20 22:35 - Adrian Pitu: Siiii +6/4/20 22:36 - Adrian Pitu: No te preocupes +6/4/20 22:36 - Adrian Pitu: La mami recuperandose poco a poco +6/4/20 22:36 - Beatriz: Bueno, yo cariño +6/4/20 22:36 - Beatriz: Bien! +6/4/20 22:36 - Adrian Pitu: La tengo conmigo en el sofa +6/4/20 22:36 - Adrian Pitu: Lo se +6/4/20 22:37 - Beatriz: Pues dale un beso sin venir a cuento pero que sea de mi parte +6/4/20 22:37 - Adrian Pitu: Eso esta hecho +6/4/20 22:37 - Adrian Pitu: Gracias🤗🤗🤗🤗 +6/4/20 22:37 - Adrian Pitu: No te preocuped +6/4/20 22:37 - Adrian Pitu: Que entre tu trabajo,familia +6/4/20 22:37 - Adrian Pitu: Y videollamdas +6/4/20 22:37 - Adrian Pitu: Iras muy liada te entiendo +6/4/20 22:38 - Beatriz: Se concentra todo a la vez +6/4/20 22:38 - Beatriz: ‎IMG-20200406-WA0133.jpg (archivo adjunto) +6/4/20 22:38 - Beatriz: Pero.... Cenaca!!! +6/4/20 22:39 - Adrian Pitu: Que buena pinta +6/4/20 23:50 - Beatriz: Bona nit! +En un ratito te toca velar por los demás😘 +7/4/20 9:26 - Beatriz: 🤗bon día! +Lo supiste. +Tot bé? +7/4/20 10:20 - Adrian Pitu: Si todo bien +7/4/20 10:20 - Adrian Pitu: Hoy lloviendo asi que vaya dia +7/4/20 10:37 - Beatriz: Aquí sol.... +7/4/20 11:04 - Adrian Pitu: Sol? +7/4/20 11:05 - Adrian Pitu: En serio? +7/4/20 11:08 - Beatriz: Ahora no +7/4/20 11:08 - Beatriz: Esta tímido +7/4/20 11:20 - Adrian Pitu: Ahhh bueno +7/4/20 12:33 - Adrian Pitu: Mañana saldra el sol +7/4/20 12:33 - Adrian Pitu: Asi q ya sabes +7/4/20 12:33 - Adrian Pitu: Para coger color +7/4/20 12:33 - Beatriz: 👏🏻👏🏻👏🏻👏🏻 +7/4/20 12:34 - Beatriz: ‎IMG-20200407-WA0091.jpg (archivo adjunto) +Estaba trabajando y con lo del reto.... Me voy liando🤦🏼‍♀ +7/4/20 12:34 - Beatriz: Mira +7/4/20 12:34 - Beatriz: Top Secret🤫 +7/4/20 12:36 - Beatriz: ‎IMG-20200407-WA0093.jpg (archivo adjunto) +Mis hermanas... Arancha tendría 13/14 +7/4/20 12:37 - Beatriz: ‎IMG-20200407-WA0095.jpg (archivo adjunto) +En el patio de la Comandancia.... 9 años +7/4/20 12:56 - Adrian Pitu: Madremia +7/4/20 12:57 - Adrian Pitu: Si si top secret +7/4/20 12:57 - Adrian Pitu: Menudo jaleo me llevas en el sofa +7/4/20 12:57 - Adrian Pitu: Madremia pitu que joven +7/4/20 12:57 - Adrian Pitu: 😬 +9/4/20 8:47 - Beatriz: 😍 +9/4/20 8:47 - Beatriz: Buenos días! +9/4/20 8:47 - Beatriz: Como va mami? +9/4/20 8:48 - Adrian Pitu: La mami va poco a poco pero bien +9/4/20 8:48 - Adrian Pitu: Y tu que tal? +9/4/20 8:52 - Beatriz: Bueno, eso es poco a poco siempre +9/4/20 8:52 - Beatriz: Bien! Trabajando🤷🏼‍♀ +9/4/20 8:53 - Adrian Pitu: Y tu tio como va? +9/4/20 8:53 - Beatriz: Igual.... +9/4/20 8:53 - Beatriz: Sin avanve +9/4/20 8:53 - Beatriz: Avance +9/4/20 9:12 - Adrian Pitu: Vaya +9/4/20 9:12 - Adrian Pitu: Bueno solo queda que esperar +9/4/20 9:13 - Beatriz: La de pacientes que nos vamos hacer todos +9/4/20 9:18 - Adrian Pitu: Ya ves +9/4/20 9:18 - Adrian Pitu: Mucha paciencia +9/4/20 9:21 - Adrian Pitu: Vamos a por el juernes +9/4/20 13:49 - Beatriz: Siiii +12/4/20 0:05 - Adrian Pitu: Yo se de una chica q va nueva york +12/4/20 0:05 - Adrian Pitu: Ya has llegado? +12/4/20 12:52 - Beatriz: Tengo jetlag🤣 +12/4/20 12:52 - Beatriz: Como esta la mamá? +12/4/20 13:26 - Adrian Pitu: Anda q privilegio +12/4/20 13:26 - Adrian Pitu: La mama ya va mejorando +12/4/20 13:26 - Adrian Pitu: En cuanto este bien la llevo al chalet con mi padre +12/4/20 13:26 - Adrian Pitu: Y tu tio como va? +12/4/20 13:30 - Beatriz: Me alegro mucho!! +12/4/20 13:31 - Beatriz: Mi tio despacio pero parece que evolucionado☺️ +12/4/20 13:40 - Adrian Pitu: Oye mejor +12/4/20 13:40 - Adrian Pitu: Que vaya evolucionando +12/4/20 13:40 - Adrian Pitu: Poco a poco +12/4/20 13:40 - Adrian Pitu: Es fuerte +12/4/20 13:45 - Beatriz: ☺️ +13/4/20 16:29 - Adrian Pitu: Igualmente..😘 +15/4/20 21:04 - Beatriz: Demasiado rastro has dejado con las señales informativas... 🤣🤣🤣 +15/4/20 21:10 - Adrian Pitu: Ya se nota ehh +15/4/20 21:10 - Adrian Pitu: Pero nadie sabe donde estoy +15/4/20 21:11 - Beatriz: Ahora mismo no +15/4/20 21:11 - Beatriz: En el momento del video... Alacuás, Picanya, xirivella.... +15/4/20 21:13 - Adrian Pitu: O madrid +15/4/20 21:13 - Adrian Pitu: O alicante o castellon +15/4/20 21:13 - Adrian Pitu: Hay muchos sitios +15/4/20 21:14 - Beatriz: No +15/4/20 21:14 - Beatriz: En Madrid no hay indicaciones a Aldaya +15/4/20 21:14 - Beatriz: Ni en Alicante +15/4/20 21:14 - Beatriz: Ni en Castellón +15/4/20 21:14 - Beatriz: 🤣😍😍 +15/4/20 21:18 - Adrian Pitu: Veo que eres muy observadora +15/4/20 21:19 - Adrian Pitu: Bueno como va tu tio? +15/4/20 21:19 - Beatriz: Demasiado +15/4/20 21:19 - Adrian Pitu: Que llevo un par de dias sin preguntarte +15/4/20 21:19 - Beatriz: Mejorando, lleva dos días con videollamada +15/4/20 21:19 - Beatriz: Ayer mi tía (su mujer) ;dio positivo... Pero la mandaron a casa +15/4/20 21:20 - Beatriz: Y tu madre? Como está? +15/4/20 21:20 - Adrian Pitu: Vaya +15/4/20 21:20 - Adrian Pitu: Pero va mejorando no? +15/4/20 21:20 - Adrian Pitu: Que es lo importante +15/4/20 21:20 - Beatriz: Si, si +15/4/20 21:23 - Adrian Pitu: Pues genial +15/4/20 21:23 - Adrian Pitu: Mi madre bien +15/4/20 21:23 - Adrian Pitu: Ya cogiendo fuerzas +15/4/20 21:23 - Adrian Pitu: Cuando pueda la mando con mi padre +15/4/20 21:23 - Adrian Pitu: Jajaja +15/4/20 21:28 - Beatriz: Jajaja +15/4/20 21:28 - Beatriz: +15/4/20 21:28 - Beatriz: Algo así? 🤣🤣 +15/4/20 21:38 - Adrian Pitu: Jajajjaaj +15/4/20 21:38 - Adrian Pitu: Mas o menos si +15/4/20 21:38 - Adrian Pitu: Yo estoy tranquilo solo por ahora en casa +15/4/20 21:56 - Beatriz: Y tu madre? No está contigo? +15/4/20 21:59 - Adrian Pitu: Si si +15/4/20 21:59 - Adrian Pitu: Esta conmigo +15/4/20 21:59 - Adrian Pitu: Pero con mi padre esta mejor +15/4/20 21:59 - Adrian Pitu: Jejee +15/4/20 22:00 - Beatriz: Jajajaja +15/4/20 22:03 - Adrian Pitu: Se porta bien mi madre +15/4/20 22:03 - Adrian Pitu: Pero dice q quiere controlar a mi padre +15/4/20 22:07 - Beatriz: Es una vida.... +15/4/20 22:16 - Adrian Pitu: Exacto toda una vida +15/4/20 22:17 - Adrian Pitu: Y mi padre me dice +15/4/20 22:17 - Adrian Pitu: No me la traigas aun +15/4/20 22:17 - Adrian Pitu: Que estoy genial +15/4/20 22:17 - Adrian Pitu: 🤦🏻‍♂️ +15/4/20 22:25 - Beatriz: Jsjsjs +15/4/20 22:25 - Beatriz: Me parto! +15/4/20 22:40 - Adrian Pitu: Si si asi es +15/4/20 22:41 - Adrian Pitu: Hoy mi padre en el chalet del vecino, lo he pillado bailando y todo de musica de remember que habia puesto mi vecino +15/4/20 22:41 - Adrian Pitu: Imaginate +15/4/20 23:36 - Beatriz: En serio?? +15/4/20 23:37 - Beatriz: Cualquier día te lo encuentras de videollamada múltiple de colegas y un gin🤣🤣🤣 +15/4/20 23:38 - Adrian Pitu: Pues con ochenta tacos +15/4/20 23:38 - Adrian Pitu: Ya me diras +15/4/20 23:39 - Adrian Pitu: Habia psado a ayudar al vecino a poner un toldo +15/4/20 23:39 - Beatriz: Ole +15/4/20 23:39 - Adrian Pitu: Y cuando me ha visto +15/4/20 23:39 - Beatriz: Por tu padre +15/4/20 23:39 - Adrian Pitu: Se ha puesto a bailar +15/4/20 23:39 - Adrian Pitu: Imaginate +15/4/20 23:39 - Beatriz: Ha dicho... La poli!!! +15/4/20 23:39 - Beatriz: Jajaja +15/4/20 23:39 - Beatriz: Me parece fantastico +15/4/20 23:39 - Adrian Pitu: Me dice +15/4/20 23:39 - Adrian Pitu: Que viene el serio barbitas +15/4/20 23:40 - Adrian Pitu: Jajajaj +15/4/20 23:40 - Beatriz: Jajaja +15/4/20 23:40 - Beatriz: Tienes más hermanos? +15/4/20 23:40 - Adrian Pitu: Si tres mas +15/4/20 23:40 - Beatriz: Ostras! +15/4/20 23:40 - Beatriz: Jajaja +15/4/20 23:40 - Adrian Pitu: Una en albacete +15/4/20 23:40 - Beatriz: 3 ni más ni menos +15/4/20 23:40 - Beatriz: Militar? +15/4/20 23:40 - Adrian Pitu: Y dos en quart y manises +15/4/20 23:41 - Adrian Pitu: Directora en un centro de Dia +15/4/20 23:41 - Beatriz: Y tu eres el más joven +15/4/20 23:42 - Adrian Pitu: Siiii +15/4/20 23:42 - Adrian Pitu: Y el mas alto de altura +15/4/20 23:48 - Adrian Pitu: Jajajja +15/4/20 23:49 - Adrian Pitu: Por cierto alli hay operaciones de vista? +15/4/20 23:49 - Beatriz: Si +15/4/20 23:49 - Adrian Pitu: Pues me interesaria mirar +15/4/20 23:49 - Beatriz: Refractiva para miopía? +15/4/20 23:49 - Beatriz: 🤔 +15/4/20 23:49 - Adrian Pitu: Astigmatismo +15/4/20 23:49 - Beatriz: También se hace +15/4/20 23:50 - Adrian Pitu: Pero tengo q operarme +15/4/20 23:50 - Adrian Pitu: Y claro estoy mirando sitios con un compi +16/4/20 0:07 - Beatriz: Ahora no se esta operando +16/4/20 0:10 - Adrian Pitu: Ya me imagino +16/4/20 0:10 - Adrian Pitu: Pero por ir a preguntar y solocitar presupuesto +16/4/20 0:16 - Beatriz: Ok. Te averiguo para cuando se reanude toda actividad del Hospital. Ok +16/4/20 0:16 - Beatriz: Se le cierran los ojos!! +16/4/20 0:16 - Adrian Pitu: Perfecto +16/4/20 0:16 - Adrian Pitu: Venga a descansar señorita +16/4/20 0:16 - Beatriz: Bona nit! Descansar😘 +16/4/20 0:16 - Adrian Pitu: Mañana mas y mejor +16/4/20 0:16 - Adrian Pitu: Na nit +16/4/20 0:16 - Adrian Pitu: 😘😘😘 +16/4/20 23:16 - Beatriz: 🤣🤣🤣 +16/4/20 23:16 - Beatriz: Ya no coincides con mi hermana!!! +16/4/20 23:21 - Adrian Pitu: Si coincido si +16/4/20 23:21 - Adrian Pitu: La semana q viene esta de mañanas y yo de noches +16/4/20 23:21 - Adrian Pitu: Siempre vamos en la misma semana +16/4/20 23:22 - Beatriz: Aaaah +16/4/20 23:22 - Adrian Pitu: Ya son años en la misma semana +16/4/20 23:22 - Adrian Pitu: Asi q genial +16/4/20 23:25 - Beatriz: Claro! +16/4/20 23:25 - Beatriz: Muchos! +16/4/20 23:25 - Beatriz: Tu estabas cuando ella llegó? +16/4/20 23:30 - Adrian Pitu: Unos meses antes +16/4/20 23:30 - Adrian Pitu: Pero s +16/4/20 23:30 - Adrian Pitu: Bueno estuvimos unos años en semanas distintas +16/4/20 23:31 - Adrian Pitu: Por el tema del segundo embarazo de tu hermana +16/4/20 23:41 - Beatriz: 🤗 +16/4/20 23:44 - Adrian Pitu: Tu dia bien? +16/4/20 23:45 - Beatriz: Si... Ajetreado +16/4/20 23:45 - Beatriz: Teletrabajo hasta las 15 +16/4/20 23:45 - Beatriz: Grabar playback para otro cumple +16/4/20 23:45 - Beatriz: Comprar para padre, ex e hijos +16/4/20 23:45 - Beatriz: Ir s Massamagrell a verlos y llevarles compra +16/4/20 23:45 - Adrian Pitu: Madremia +16/4/20 23:46 - Adrian Pitu: No has parado +16/4/20 23:46 - Beatriz: Noooo +16/4/20 23:46 - Beatriz: Eso me hace estar feliz +16/4/20 23:47 - Beatriz: Vida social videos +16/4/20 23:47 - Beatriz: Lavadora +16/4/20 23:47 - Beatriz: Cena +16/4/20 23:47 - Beatriz: Y.... Vicio!!! +16/4/20 23:47 - Beatriz: Hoy este +16/4/20 23:47 - Beatriz: ‎IMG-20200416-WA0155.jpg (archivo adjunto) +16/4/20 23:47 - Beatriz: 🤭🙄 +16/4/20 23:47 - Adrian Pitu: Ya veo ya +16/4/20 23:47 - Adrian Pitu: Joer eso es un buen vicio +16/4/20 23:47 - Adrian Pitu: Pero te lo has ganado +16/4/20 23:48 - Beatriz: El chocolate me pierde +16/4/20 23:48 - Beatriz: Pero sin remedio ni opción de encontrar salida alguna!! +16/4/20 23:49 - Adrian Pitu: Ya claro +16/4/20 23:49 - Beatriz: Bueno, excepto la carne distinta al pollo, pavo, pato o lomo... Toda la comida me Pirra. +16/4/20 23:50 - Beatriz: Me paso el día comiendo, toda la vida así!!! Disfrutó comíendo. +16/4/20 23:51 - Adrian Pitu: Anda q bien +16/4/20 23:51 - Adrian Pitu: Yo disfruto comiendo +16/4/20 23:51 - Adrian Pitu: Pero yo lo noto +16/4/20 23:51 - Adrian Pitu: Que me tengo q controlar +16/4/20 23:51 - Adrian Pitu: Sino me disparo +16/4/20 23:56 - Beatriz: Yo me controlo poco +16/4/20 23:56 - Beatriz: Así me pasa... 🙄 +17/4/20 0:56 - Adrian Pitu: Q te pasa... +17/4/20 1:02 - Beatriz: La línea!!! +17/4/20 1:03 - Adrian Pitu: Pero a ti no se te nota +17/4/20 1:03 - Adrian Pitu: Hazme caso +17/4/20 1:03 - Beatriz: Jojojo +17/4/20 1:03 - Beatriz: Que te ha parecido la felicitacion de face de mi amigo🙄 +17/4/20 1:03 - Beatriz: Agapimu! +17/4/20 1:04 - Adrian Pitu: No la he visto muy bien +17/4/20 1:04 - Adrian Pitu: A mitad me he quedado +17/4/20 1:05 - Beatriz: Esta gracioso +17/4/20 1:07 - Adrian Pitu: Pues cuando pueda lo veo +17/4/20 1:07 - Adrian Pitu: Lo termino de ver +17/4/20 1:14 - Beatriz: Ok +17/4/20 1:14 - Beatriz: Dormir sr. Agente +17/4/20 1:14 - Beatriz: Bona nit😘 +17/4/20 1:16 - Adrian Pitu: Buenas noches señorita +17/4/20 1:16 - Adrian Pitu: Descansa +17/4/20 1:16 - Adrian Pitu: 😘 +18/4/20 19:44 - Beatriz: Sr. Agente... +18/4/20 19:44 - Beatriz: Le pararon en algún control? 🤣 +18/4/20 20:13 - Adrian Pitu: Señorita +18/4/20 20:14 - Adrian Pitu: Aun no +18/4/20 20:14 - Adrian Pitu: Que le parece? +18/4/20 20:27 - Beatriz: Que tuvo usted mucha suerte.... A mi me paran siempre! 🙄 +18/4/20 20:29 - Adrian Pitu: Si si mucha +18/4/20 20:30 - Adrian Pitu: Y hoy para ir y volver a mi chalet +18/4/20 20:30 - Adrian Pitu: Que hay varias rotondas +18/4/20 20:30 - Adrian Pitu: Nadie +18/4/20 20:35 - Beatriz: Que cosas... 🙄 +18/4/20 20:35 - Beatriz: Sales hoy? 🤣 +18/4/20 20:39 - Adrian Pitu: No lo se +18/4/20 20:40 - Adrian Pitu: Creo q ire ruzafa +18/4/20 20:40 - Adrian Pitu: Por cambiar de aires +18/4/20 20:51 - Beatriz: Yo estaba pensando lo mismo +22/4/20 23:04 - Beatriz: Yo un Mercedes! +22/4/20 23:04 - Adrian Pitu: Te lo vendo +22/4/20 23:04 - Adrian Pitu: El que tengo +22/4/20 23:04 - Adrian Pitu: Te iba escribir hoy +22/4/20 23:05 - Beatriz: Clase c? +22/4/20 23:05 - Adrian Pitu: Sportcoupe +22/4/20 23:05 - Beatriz: Mmmmm.... +22/4/20 23:06 - Adrian Pitu: Que ayer hable con tu hermana +22/4/20 23:06 - Beatriz: Si? +22/4/20 23:06 - Beatriz: Y qué? +22/4/20 23:06 - Adrian Pitu: De tu tio +22/4/20 23:07 - Adrian Pitu: Que campeon esta hecho +22/4/20 23:07 - Beatriz: Esta mucho mejor +22/4/20 23:07 - Beatriz: Siiii +22/4/20 23:07 - Adrian Pitu: Muy emotivo el video +22/4/20 23:07 - Adrian Pitu: La verdad +22/4/20 23:07 - Adrian Pitu: Que fuerza de voluntad +22/4/20 23:07 - Beatriz: Si, no soy de lágrima fácil... Y me salió +22/4/20 23:07 - Beatriz: No sabía que eres de la capi!!! +22/4/20 23:08 - Adrian Pitu: Normal +22/4/20 23:08 - Adrian Pitu: A mi se me hubiera escapado +22/4/20 23:08 - Adrian Pitu: Pegado a la capi +22/4/20 23:09 - Beatriz: Lo ví en tu face +22/4/20 23:20 - Adrian Pitu: Vivo en quart de poblet +22/4/20 23:20 - Adrian Pitu: De toda la vida +22/4/20 23:21 - Adrian Pitu: Aunq mis pdres son de cuenca los dos +22/4/20 23:32 - Beatriz: Siii, donde nací yo +22/4/20 23:33 - Beatriz: Capital? Mi padre es de Saelices, supongo que lo sabes +23/4/20 0:00 - Adrian Pitu: Si si lo se +23/4/20 0:00 - Adrian Pitu: Anda q casualidad q nacieras en quart +23/4/20 0:00 - Adrian Pitu: 😏 +23/4/20 0:51 - Adrian Pitu: Encima eres de agosto como yo +23/4/20 0:51 - Adrian Pitu: Mas casualidad todavia +24/4/20 22:43 - Beatriz: Está aquí mi mejor amiga +24/4/20 22:43 - Beatriz: Susana +24/4/20 22:43 - Adrian Pitu: Sera secreto profesional +24/4/20 22:43 - Beatriz: Llevábamos 5 semanas sin vernos +24/4/20 22:43 - Adrian Pitu: Ahhh vale +24/4/20 22:43 - Adrian Pitu: No te preocupes +24/4/20 22:43 - Beatriz: Y nos moriamos por abrazarnos +24/4/20 22:43 - Beatriz: Se separó hace 3 meses🙄 +24/4/20 22:43 - Adrian Pitu: Pues sin problemas +24/4/20 22:43 - Adrian Pitu: No pasa nada +24/4/20 22:43 - Adrian Pitu: Muy reciente +24/4/20 22:44 - Beatriz: Ha venido y hemos hecho tardeo en la terraza +24/4/20 22:44 - Adrian Pitu: Entonces esta autorizado +24/4/20 22:44 - Beatriz: Y ahora estamos de gins +24/4/20 22:44 - Adrian Pitu: El tema abrazos +24/4/20 22:44 - Adrian Pitu: Ohhhh +24/4/20 22:44 - Beatriz: Se quedará a dormir, pq entre su casa y la mía hay un retén de policia😬 +24/4/20 22:44 - Adrian Pitu: Ahhhhh +24/4/20 22:44 - Adrian Pitu: Pues mejor si +24/4/20 22:44 - Beatriz: A ver como justifica +24/4/20 22:45 - Adrian Pitu: Ya +24/4/20 22:45 - Adrian Pitu: Pues un tardeo cubateo +24/4/20 22:45 - Adrian Pitu: Jajajja +24/4/20 22:45 - Beatriz: El nivel de alcohol a la 1 de la mañana🤣 +24/4/20 22:45 - Beatriz: 5 semanas! 🤦🏼‍♀ +24/4/20 22:45 - Adrian Pitu: Pues ya me diras +24/4/20 22:46 - Adrian Pitu: Te cuento un secreto +24/4/20 22:46 - Beatriz: Dime +24/4/20 22:46 - Adrian Pitu: Yo el sabado psado +24/4/20 22:46 - Adrian Pitu: Me fui a casa de un compi +24/4/20 22:46 - Adrian Pitu: Que estaba con su hermano +24/4/20 22:46 - Adrian Pitu: E hicimos un tardeo +24/4/20 22:46 - Beatriz: Jajajaja +24/4/20 22:48 - Beatriz: Hablamos! +24/4/20 22:48 - Beatriz: 😘 +24/4/20 22:48 - Adrian Pitu: 😘 +26/4/20 16:09 - Beatriz: Que madrugador eres!!! +26/4/20 16:18 - Beatriz: ‎IMG-20200426-WA0057.jpg (archivo adjunto) +26/4/20 18:40 - Adrian Pitu: Salia de trabajar +26/4/20 18:41 - Adrian Pitu: Esa foto no se que sera +26/4/20 18:41 - Adrian Pitu: 🙄 +28/4/20 11:03 - Beatriz: Este coche no es un Mercedes... Diría Peugeot o Citroen +28/4/20 11:08 - Adrian Pitu: Buenos dias +28/4/20 11:08 - Adrian Pitu: Pues no has acertado aun +28/4/20 11:08 - Adrian Pitu: Llevo varios coches +28/4/20 11:08 - Beatriz: Renault +28/4/20 11:08 - Beatriz: Eres milloneti? +28/4/20 11:10 - Adrian Pitu: Ojala +28/4/20 11:10 - Adrian Pitu: Pero me gusta jugar al despiste +28/4/20 11:12 - Beatriz: Ya... Pero varios coches hay que mantenerlos... Sabes? +28/4/20 11:12 - Beatriz: Cuantos tienes? +28/4/20 11:12 - Beatriz: Yo solo 1🤣 +28/4/20 11:14 - Adrian Pitu: Tengo 2 +28/4/20 11:14 - Adrian Pitu: Pero el tercero es de mi padre que no lo mueve +28/4/20 11:42 - Beatriz: Aaaah +28/4/20 11:43 - Beatriz: Y moto! +28/4/20 16:07 - Beatriz: Este si! +28/4/20 16:08 - Beatriz: Pero cuantos km haces tú al día?!!! 😳 +28/4/20 16:56 - Adrian Pitu: Ahhhh como lo sabes ehh +28/4/20 16:57 - Adrian Pitu: No muchos la verdad +28/4/20 16:57 - Beatriz: Me gustan los coches.... Y he estado en el sector 10 años +28/4/20 16:58 - Beatriz: Pero todos los días conduces.... De servicio o confinado🤣 +28/4/20 17:02 - Adrian Pitu: Si? A mi me encantan +28/4/20 17:02 - Adrian Pitu: Si si +28/4/20 17:02 - Adrian Pitu: Jajjaja +28/4/20 17:04 - Beatriz: Pues eso... +28/4/20 17:04 - Beatriz: Yo mañana me llevo el de mi padre para moverlo +29/4/20 18:10 - Adrian Pitu: La conozco de algo pero no me acuerdo..😏 +29/4/20 18:12 - Beatriz: Eso es que la has visto poco +29/4/20 18:13 - Beatriz: Además, lleva días sin peinarse y seguramente la conociste con el pelo liso o coleta +29/4/20 18:13 - Beatriz: 🤣 +29/4/20 18:25 - Adrian Pitu: Con coleta si +29/4/20 18:25 - Adrian Pitu: Ya tocaba q te peinaras ehh +29/4/20 18:25 - Adrian Pitu: Jejejej +29/4/20 18:46 - Beatriz: Me peinare en breve +29/4/20 18:47 - Beatriz: Esto es resultado de salir de la ducha y ni hacerlo +29/4/20 18:54 - Adrian Pitu: Tampoco te queda tan mal el pelo asi +29/4/20 18:54 - Adrian Pitu: 🤗🤗 +30/4/20 19:22 - Beatriz: 🤦🏼‍♀ +30/4/20 19:29 - Adrian Pitu: Tomando el sol +30/4/20 19:29 - Adrian Pitu: Se puede no? +30/4/20 19:31 - Beatriz: Si, puedes... +30/4/20 19:37 - Adrian Pitu: Claro +30/4/20 19:37 - Adrian Pitu: Un rato a desconectar +30/4/20 19:42 - Beatriz: Que puedes además hacer fotos, digo... +30/4/20 19:49 - Adrian Pitu: Voy a hacerme un bokk +30/4/20 19:49 - Adrian Pitu: Book +30/4/20 19:49 - Adrian Pitu: 😬 +30/4/20 19:50 - Beatriz: Envíame copia +30/4/20 19:50 - Beatriz: Que tengo amigas solteras +30/4/20 20:00 - Beatriz: Te cuento.... +30/4/20 20:00 - Adrian Pitu: Dime +30/4/20 20:00 - Beatriz: Que tengo confianza +30/4/20 20:00 - Beatriz: +Así hemos empezado.... +30/4/20 20:01 - Beatriz: Ahora llevamos 4 botellas de vinito +30/4/20 20:01 - Beatriz: Y creo que no quieren irse... +30/4/20 20:01 - Beatriz: Ni aplaudir... +30/4/20 20:03 - Adrian Pitu: No me digs +30/4/20 20:03 - Adrian Pitu: Que salgan por lo menos +30/4/20 20:07 - Beatriz: +30/4/20 20:07 - Beatriz: +30/4/20 20:07 - Beatriz: +30/4/20 20:07 - Beatriz: +30/4/20 20:07 - Beatriz: Así vamos... Veras la llamada familiar de las 20:30🤣🤦🏼‍♀ +30/4/20 20:08 - Adrian Pitu: Madremia +30/4/20 20:08 - Adrian Pitu: Jjajja +30/4/20 20:08 - Adrian Pitu: Haceis bien +30/4/20 20:08 - Adrian Pitu: Hay q disfrutar q leches +30/4/20 20:08 - Adrian Pitu: 😏 +30/4/20 21:28 - Adrian Pitu: Como van las solteras? +30/4/20 21:42 - Beatriz: Del revés! +30/4/20 21:47 - Adrian Pitu: O al reves! +30/4/20 21:48 - Beatriz: Vaya tela! +30/4/20 21:49 - Beatriz: Me he puesto el pijama y he encendido la luz para la llamada familiar🤣 +30/4/20 21:50 - Beatriz: Vamos a cenar, he hecho ceviche de berberechos +30/4/20 21:50 - Adrian Pitu: La llamada bien? +30/4/20 21:50 - Beatriz: ‎IMG-20200428-WA0181.jpg (archivo adjunto) +30/4/20 21:51 - Beatriz: Pues.... +30/4/20 21:51 - Beatriz: Me he dado cuenta de que solo he hablado yi +30/4/20 21:51 - Beatriz: Con eso de que ni quería que se notara el vino +30/4/20 21:51 - Beatriz: 🤦🏼‍♀🤣 +30/4/20 21:52 - Beatriz: Quinta botella... Una ha causado ya baja, se ha ido +30/4/20 21:52 - Beatriz: Mi primo (ese) se irá +30/4/20 21:52 - Beatriz: La otra creo que se queda a dormir +30/4/20 21:52 - Beatriz: Eso lenta dicho a su madre +30/4/20 21:54 - Adrian Pitu: Si? +30/4/20 21:54 - Adrian Pitu: Vamos q no has pardo de hablar +30/4/20 21:54 - Adrian Pitu: Tu familia callada +30/4/20 21:54 - Adrian Pitu: Me imagino +30/4/20 22:18 - Beatriz: Ay... Adrián +30/4/20 22:19 - Beatriz: Si estuvieran abiertas las discotecas +30/4/20 22:19 - Beatriz: 🙄 +30/4/20 22:19 - Beatriz: Si es que... Yo soy así +30/4/20 22:19 - Adrian Pitu: Pues ya se donde de acababa +30/4/20 22:19 - Adrian Pitu: La fiesta +30/4/20 22:19 - Adrian Pitu: 🙄 +30/4/20 22:19 - Beatriz: Solo quiero vivir y disfrutar la vids +30/4/20 22:20 - Beatriz: Siempre que mis hijos no estén conmigo +30/4/20 22:20 - Beatriz: Por encima de eso no hay nada +30/4/20 22:20 - Beatriz: Pero si están con su padre!! +30/4/20 22:22 - Adrian Pitu: Pues esa es la actitud +30/4/20 22:22 - Adrian Pitu: Ya sabes +30/4/20 22:22 - Adrian Pitu: La vida son dos dias +30/4/20 22:22 - Adrian Pitu: Y ahora mas que nunca +30/4/20 22:22 - Adrian Pitu: Despues de pasar penas +30/4/20 22:22 - Adrian Pitu: Hay q cambiar la mentalidad +30/4/20 22:23 - Adrian Pitu: Y disfrutar y hacer cada uno lo que quiera +30/4/20 22:26 - Beatriz: Si +1/5/20 15:46 - Beatriz: 🤗 +1/5/20 16:18 - Beatriz: ‎IMG-20200501-WA0057.jpg (archivo adjunto) +1/5/20 16:41 - Adrian Pitu: Lo veo genial por su parte ña verdad.. +1/5/20 16:41 - Adrian Pitu: Feliz dia trabajadora +1/5/20 16:46 - Beatriz: Feliz día, trabajador! +3/5/20 12:22 - Adrian Pitu: Feliz dia de la mami +3/5/20 12:22 - Adrian Pitu: 😘😘😘😘 +3/5/20 15:42 - Beatriz: Gracias sr.agente! 😘 +3/5/20 16:42 - Beatriz: 😍 +3/5/20 18:19 - Beatriz: Adrián.... +3/5/20 18:19 - Beatriz: De que color son tus ojos? Me he fijado ahora... Y te hubiera descrito con ojos marrones, creo que no🤭 +3/5/20 18:32 - Adrian Pitu: Noooo +3/5/20 18:32 - Adrian Pitu: Mis ojos son grises +3/5/20 18:35 - Adrian Pitu: Y segun el sol como pegue salen azulados +3/5/20 18:36 - Beatriz: Los míos siempre azules +3/5/20 19:44 - Adrian Pitu: 🤗🤗🤗 +3/5/20 21:08 - Beatriz: Maravilloso! 👏🏻👏🏻👏🏻👏🏻 +3/5/20 21:10 - Adrian Pitu: Que buen dia la verdad +3/5/20 21:14 - Beatriz: Me alegro muchísimo! +3/5/20 21:15 - Adrian Pitu: Gracias 🤗🤗🤗🤗 +4/5/20 11:15 - Adrian Pitu: Buenos dias señorita +4/5/20 11:15 - Adrian Pitu: Ya trabajando? +4/5/20 11:17 - Beatriz: Si, desde casa por las mañanas y 2/3 días de consultas por la tarde +4/5/20 11:17 - Beatriz: Y tú? Trabajando? +4/5/20 11:53 - Adrian Pitu: Pues yo estoy de tardes hoy +4/5/20 11:53 - Adrian Pitu: Ya he recogido la casa +4/5/20 11:53 - Adrian Pitu: Y preparado ropa +4/5/20 11:53 - Adrian Pitu: Y enseguida al campo de batalla +4/5/20 12:05 - Beatriz: Con mi hermana? +4/5/20 12:05 - Adrian Pitu: Nooo +4/5/20 12:05 - Adrian Pitu: 😔 +4/5/20 12:05 - Beatriz: Oh +4/5/20 12:05 - Adrian Pitu: Tu hermana esta de noches +4/5/20 12:06 - Beatriz: Se que está esta semana, pero no sabía turno +4/5/20 12:06 - Beatriz: Bueno, os veréis en el cambio +4/5/20 12:53 - Adrian Pitu: Siiiii +4/5/20 12:53 - Adrian Pitu: Sino lo ha cambiado claro +4/5/20 12:53 - Adrian Pitu: A lo mejor me sorprende +4/5/20 12:55 - Beatriz: No lo se... +5/5/20 17:42 - Beatriz: Oooooh! +5/5/20 17:43 - Adrian Pitu: Q te parece +5/5/20 17:43 - Adrian Pitu: Un regalo +5/5/20 17:44 - Beatriz: Me parece un regalo precioso! +5/5/20 18:00 - Adrian Pitu: Siiii +5/5/20 18:00 - Adrian Pitu: Un detallazo +6/5/20 9:56 - Beatriz: 😍 +6/5/20 10:30 - Adrian Pitu: Buenos dias señorita +6/5/20 10:30 - Adrian Pitu: Ver el amanecer no tiene precio +6/5/20 10:31 - Beatriz: Desde luego que no lo tiene. +Has madrugado!!! Un pelín... 🤣 +6/5/20 10:52 - Adrian Pitu: Un pelin bastante +6/5/20 10:52 - Adrian Pitu: Y eso que me dormia a las dos +6/5/20 11:51 - Beatriz: Jolin +6/5/20 11:51 - Beatriz: Insomnio? +6/5/20 11:52 - Beatriz: Igual mañana por la mañana lo hago yo tb! Me voy a mi playa particular... +6/5/20 11:52 - Beatriz: El problema es si me paran, que digo??? +6/5/20 12:03 - Adrian Pitu: Claro en valencia son estrictos +6/5/20 12:03 - Adrian Pitu: Ese es el tema +6/5/20 12:03 - Adrian Pitu: Q en teoria no puedes salir d un km +6/5/20 12:03 - Adrian Pitu: De casa +6/5/20 12:05 - Beatriz: Esperare a pasar de fase... 🤷🏼‍♀ +6/5/20 12:10 - Adrian Pitu: Siiii +6/5/20 12:10 - Adrian Pitu: Hazme caso +6/5/20 12:10 - Adrian Pitu: Q ya queda menos +6/5/20 12:13 - Beatriz: Yes +7/5/20 13:01 - Beatriz: ‎IMG-20200507-WA0026.jpg (archivo adjunto) +Jajajaja +7/5/20 13:35 - Adrian Pitu: Si solo fuera eso +7/5/20 13:35 - Adrian Pitu: 🙄 +7/5/20 13:35 - Adrian Pitu: Buenos dias señorita +8/5/20 16:28 - Adrian Pitu: No te vas a aburrir señorita... +8/5/20 17:51 - Beatriz: No! 🤗 +8/5/20 17:53 - Beatriz: Moreno rural! 🤭 +8/5/20 17:59 - Adrian Pitu: Siii +8/5/20 17:59 - Adrian Pitu: Menudos dias de calor +8/5/20 17:59 - Adrian Pitu: 😱 +8/5/20 18:00 - Beatriz: Bueno... Hoy no tanta +8/5/20 18:00 - Beatriz: Yo no soy muy calurosa, la verdad +8/5/20 18:29 - Adrian Pitu: No no +8/5/20 18:29 - Adrian Pitu: Hoy bien +8/5/20 18:29 - Adrian Pitu: Mañana seguire tomando el sol +8/5/20 18:29 - Adrian Pitu: Hoy finde con los nanos no? +8/5/20 18:30 - Beatriz: Siiii +8/5/20 18:30 - Beatriz: Después de 55 dias +8/5/20 18:30 - Beatriz: Se quedan conmigo hasta el 22 +8/5/20 18:30 - Beatriz: Así su padre descansa un poco y ve a su novia +8/5/20 18:31 - Beatriz: Debe de estar que se sube por las paredes🤣con lo feilla que es.... 🤔🤣 +8/5/20 18:39 - Adrian Pitu: Genial no? +8/5/20 18:39 - Adrian Pitu: Que buena eres +8/5/20 18:39 - Adrian Pitu: Jajajjaja +8/5/20 18:42 - Beatriz: Si +8/5/20 18:43 - Beatriz: Ellos siempre están conmigo +8/5/20 18:43 - Beatriz: Esto lo ha trastocado +10/5/20 14:30 - Beatriz: Temazo! +10/5/20 14:35 - Adrian Pitu: Una cancion muy bonita +10/5/20 14:51 - Adrian Pitu: Aunq me la dedicaron mis sobrinos +10/5/20 14:51 - Adrian Pitu: Que dicen q soy su heroe +10/5/20 14:52 - Beatriz: Que chulo! +16/5/20 13:30 - Adrian Pitu: Que alegria +16/5/20 13:30 - Adrian Pitu: La fase 1 +16/5/20 13:44 - Beatriz: A mi me da cosa... +16/5/20 14:02 - Adrian Pitu: Y esoV +16/5/20 14:02 - Adrian Pitu: ? +16/5/20 14:10 - Beatriz: Porque creo que va a ser Sosoma y Gomorra +16/5/20 14:13 - Adrian Pitu: Ya +16/5/20 14:13 - Adrian Pitu: Asi va a ser si +16/5/20 14:13 - Adrian Pitu: Y van a ver despuntes +16/5/20 14:13 - Adrian Pitu: Eso si +16/5/20 14:48 - Beatriz: No lo dudes +16/5/20 14:48 - Beatriz: Vais a flipar de faena ahora +16/5/20 14:50 - Adrian Pitu: Lo se +16/5/20 14:51 - Adrian Pitu: 😔 +16/5/20 15:42 - Beatriz: Madre de Dios! El hombre kilómetros!!! 🤭 +16/5/20 16:02 - Adrian Pitu: Yo? +16/5/20 16:02 - Adrian Pitu: Como willy foog? +16/5/20 16:03 - Beatriz: Tal cual🤣 +16/5/20 16:04 - Beatriz: Te faltan Romi, Tico y Rigodon! 🤣 +16/5/20 19:01 - Adrian Pitu: Jajajaj +16/5/20 19:01 - Adrian Pitu: Asi es si +16/5/20 19:01 - Adrian Pitu: Como lo sabes? +16/5/20 19:47 - Beatriz: Soy bruja +18/5/20 13:06 - Beatriz: Ooooh +18/5/20 14:25 - Adrian Pitu: Que maravilla +18/5/20 14:25 - Adrian Pitu: La verdad +18/5/20 14:43 - Beatriz: Jajaja +18/5/20 14:43 - Beatriz: Están las terrazas a tope +18/5/20 15:12 - Adrian Pitu: Ya ya +18/5/20 15:12 - Adrian Pitu: Madremia q desastre +18/5/20 15:12 - Adrian Pitu: Como sino hubiera psado nada +19/5/20 19:40 - Beatriz: Oui! +19/5/20 19:54 - Adrian Pitu: Asi es si +25/5/20 23:05 - Beatriz: A mi me pasa igual.... 🤣🤣🤣 +25/5/20 23:05 - Beatriz: Así es... +3/6/20 16:37 - Beatriz: 😟que ha pasado? +3/6/20 17:28 - Adrian Pitu: Un tio en un bar, reconocio al compañero como policia y le revento un vaso en la cara +3/6/20 17:28 - Adrian Pitu: Imaginate +3/6/20 17:28 - Adrian Pitu: Para luego q digan que no hacemos nada +3/6/20 17:37 - Beatriz: No me lo puedo creer! +3/6/20 19:09 - Adrian Pitu: La primera sin duda +3/6/20 19:17 - Beatriz: Yes!! +6/6/20 21:16 - Beatriz: Yo quiero!!! +7/6/20 2:27 - Adrian Pitu: Y yo tambien quiero +7/6/20 2:28 - Adrian Pitu: Q aun no me he metido +7/6/20 2:28 - Adrian Pitu: 😔 +7/6/20 2:28 - Beatriz: Estas con Pitu esta noche? +7/6/20 2:28 - Adrian Pitu: Siii +7/6/20 2:28 - Adrian Pitu: Aqui la tengo +7/6/20 2:28 - Adrian Pitu: Cuidandola +7/6/20 2:29 - Beatriz: Muy bien! +7/6/20 2:29 - Beatriz: 🤗 +7/6/20 2:35 - Adrian Pitu: Tu de reunion de primos no? +7/6/20 2:43 - Beatriz: Jajajaj +7/6/20 2:43 - Beatriz: Siiii +7/6/20 2:44 - Beatriz: Acabamos este gin y estas risas y a casa +7/6/20 3:16 - Adrian Pitu: 🙄 +8/6/20 13:17 - Beatriz: Has bebido? +8/6/20 13:56 - Adrian Pitu: Nooo +8/6/20 13:56 - Adrian Pitu: Un camionero ruso +8/6/20 13:56 - Adrian Pitu: Dio esa tasa +8/6/20 13:57 - Adrian Pitu: Y el tio no tenia muchos sintomas de embriaguez +8/6/20 14:22 - Beatriz: Ruso!! +8/6/20 14:22 - Beatriz: Mi cuñada es rusa +8/6/20 14:22 - Beatriz: Bebé todos los días desde prácticamente niña +8/6/20 14:22 - Beatriz: No la tumbas! +8/6/20 14:22 - Beatriz: Están muy habituados +9/6/20 9:55 - Beatriz: +9/6/20 9:56 - Adrian Pitu: Saltando una valla +9/6/20 9:56 - Adrian Pitu: Me clave un hierro +9/6/20 9:56 - Adrian Pitu: No queria q tu hermana saltara tambien +9/6/20 10:04 - Beatriz: Jolin! +9/6/20 10:04 - Beatriz: Y era preciso saltar la valla? +9/6/20 10:05 - Beatriz: Te han puesto antitetanica? +9/6/20 10:08 - Adrian Pitu: Pues hubo un salto de alarma en el instituto +9/6/20 10:08 - Adrian Pitu: Y por donde entramos habian metido un hierro en la cerradura +9/6/20 10:08 - Adrian Pitu: Y claro no quedaba otra q saltar +9/6/20 10:08 - Adrian Pitu: Para al final nada pero bueno +9/6/20 10:11 - Beatriz: Policías! 😍 +9/6/20 10:17 - Adrian Pitu: Asi es el trabajo 😘😘 +10/6/20 12:35 - Beatriz: Cierto +10/6/20 12:41 - Adrian Pitu: Y mas cuando pasas baches en la vida +10/6/20 13:24 - Beatriz: Si... Lo sabes ya, verdad? +10/6/20 13:44 - Adrian Pitu: Si lo se si +10/6/20 13:44 - Adrian Pitu: Me lo conto tu hermana el domingo a la noche +10/6/20 13:44 - Adrian Pitu: Te mando mucho animo y fuerza la verdad +10/6/20 13:44 - Adrian Pitu: Y sobretodo positivismo +10/6/20 13:44 - Adrian Pitu: Que ya veras que saldra todo bien +10/6/20 13:55 - Beatriz: Gracias Adrián! 😘 +11/6/20 11:19 - Adrian Pitu: Consultas 4 Quirón + +https://foursquare.com/v/502cbefee4b0beacbce389c1 +11/6/20 11:19 - Adrian Pitu: 🙄 +11/6/20 11:20 - Beatriz: No me digas que estas en mi trabajo???? +11/6/20 11:20 - Adrian Pitu: Estoy con un compi si +11/6/20 11:21 - Adrian Pitu: En tu trabajo +11/6/20 11:21 - Beatriz: Vaya! Por las mañanas hasta septiembre haré teletrabajo... +11/6/20 11:21 - Beatriz: 😕 +11/6/20 11:21 - Adrian Pitu: Vaya por dios +11/6/20 11:21 - Adrian Pitu: Pues he venido +11/6/20 11:21 - Adrian Pitu: A acompañarlo +11/6/20 11:21 - Adrian Pitu: Para el tema de la vista +11/6/20 11:22 - Beatriz: Miopía? Astigmatismo? +11/6/20 11:22 - Beatriz: Hipermetropia? +11/6/20 11:27 - Adrian Pitu: Ahora le diran +11/6/20 11:35 - Beatriz: Si necesitáis algo, me dices. +11/6/20 12:18 - Adrian Pitu: 🤗🤗🤗 +17/6/20 10:22 - Beatriz: Será cierto??? +17/6/20 10:23 - Beatriz: 😔 +17/6/20 11:02 - Adrian Pitu: Yo pienso q si +17/6/20 11:02 - Adrian Pitu: 😏 +17/6/20 11:06 - Beatriz: Jajaja.... Yo también🙄 +17/6/20 11:06 - Beatriz: Estas de noches con Pitu? +17/6/20 11:09 - Adrian Pitu: Si? +17/6/20 11:09 - Adrian Pitu: Noooo +17/6/20 11:09 - Adrian Pitu: Tu hermana se ha cansado de mi +17/6/20 11:10 - Adrian Pitu: Esta con otro compi +17/6/20 11:30 - Beatriz: Pero si eres Leo!!!! Como es posible??? 🤣 +17/6/20 11:34 - Adrian Pitu: Pues no lo se +17/6/20 11:34 - Adrian Pitu: Lo sabra tu hermana +17/6/20 11:34 - Adrian Pitu: 🤪 +17/6/20 11:38 - Beatriz: Que le habras hecho!! Con lo Piscis zen que es ella!!! +31/12/20 10:04 - Beatriz: Feliz Año, Sr.Agente!😘 +31/12/20 10:18 - Adrian Pitu: Gracias guapi!! Feliz año 😘 +15/2/21 13:26 - Adrian Pitu: Muy aplicada 🙄 +15/2/21 13:48 - Beatriz: 😅 +2/3/21 19:30 - Adrian Pitu: ‎IMG-20210302-WA0050.jpg (archivo adjunto) +Detalle de tu hermana..🤗🤗🤗 +2/3/21 20:10 - Beatriz: Así es ella🤩 +2/3/21 20:16 - Adrian Pitu: Me cuida bien 🤗🤗🤗❤️ +2/3/21 21:53 - Beatriz: Es un sol! +2/7/21 13:59 - Adrian Pitu: Mucho animo guapa.. +2/7/21 14:03 - Beatriz: Siiii.. +Nostalgia natural😘 +2/7/21 14:05 - Adrian Pitu: Normal y logico +2/7/21 14:05 - Adrian Pitu: 😘 +10/8/21 13:39 - Adrian Pitu: Muchas felicidades señorita!!! Que sigas cumpiendo muchos mas..te mando un beso enorme +10/8/21 13:55 - Beatriz: Muchísimas gracias!😘 +23/8/21 16:38 - Adrian Pitu: Te acompaño en el sentimiento y te mando un besazo enorme en estos momentos..😘 +23/8/21 17:06 - Beatriz: 💔😘 +12/11/21 0:49 - Adrian Pitu: Buenas señorita +12/11/21 0:50 - Adrian Pitu: Que ha pasado? +12/11/21 0:50 - Beatriz: Se está muy bien solo/a +12/11/21 0:51 - Adrian Pitu: Tu estas bien? +12/11/21 0:51 - Adrian Pitu: Que algo me han contado +12/11/21 0:51 - Adrian Pitu: Ya sabes.. +12/11/21 0:51 - Beatriz: Bueno, decepcionada +12/11/21 0:52 - Adrian Pitu: Ya entiendo +12/11/21 0:52 - Adrian Pitu: Mas decepcionada que otra cosa +12/11/21 0:52 - Adrian Pitu: Un tema delicado +12/11/21 0:53 - Beatriz: Resumo a ver qué opinas? +12/11/21 0:53 - Adrian Pitu: Dime +12/11/21 0:54 - Beatriz: Volviendo de un fin de genial. +12/11/21 0:54 - Beatriz: El está obsesionado con que entre tú y yo hay algo....🙄 +12/11/21 0:56 - Beatriz: Precisamente tu, que de haber querido ambos...incluso en el confinamiento; tu poli y yo personal de hospital ...no hay nada que añadir . De hecho, le he reportado toda nuestra conversación desde que nos conocímos +12/11/21 0:56 - Beatriz: Nada que ocultar... +12/11/21 0:56 - Adrian Pitu: No me digas +12/11/21 0:56 - Adrian Pitu: Me dejas a cuadros +12/11/21 0:56 - Beatriz: Si ...eres su pesadilla +12/11/21 0:57 - Beatriz: 🤷🏼‍♀️ya ves! +12/11/21 0:57 - Beatriz: El caso es que durante año y medio he dejado realmente de ser yo, por apostar por el y que no sufriera por algo sin fundamento +12/11/21 0:58 - Adrian Pitu: Vaya tela de verdad +12/11/21 0:58 - Beatriz: Obviando que él tenía novia y durantebmasbde un año fui la otra +12/11/21 0:58 - Adrian Pitu: Que bien oculto lo tenia +12/11/21 1:00 - Beatriz: Jo....me parece increíble que tengas que ver en esto. +12/11/21 1:01 - Adrian Pitu: Nada tranquila +12/11/21 1:01 - Adrian Pitu: Me hace gracia la verdad +12/11/21 1:01 - Adrian Pitu: Mas que otra cosa +12/11/21 1:01 - Adrian Pitu: Que me odiara +12/11/21 1:02 - Beatriz: Dice que le ganaste la partida....porque un día te dije "cuidado" y si habías llegado a casa o algo así durante el confinamiento +12/11/21 1:03 - Beatriz: Tiene la conversación integra en su mail +12/11/21 1:03 - Beatriz: El tema +12/11/21 1:03 - Adrian Pitu: Madremia +12/11/21 1:03 - Adrian Pitu: Bueno que la enmarque si quiere en un cuadro +12/11/21 1:04 - Adrian Pitu: Si le hace ilusion +12/11/21 1:04 - Beatriz: Cambié por el en el sentido de 0 vida social +12/11/21 1:04 - Beatriz: Durante 1 año y medio +12/11/21 1:04 - Beatriz: En su cada con y sin niños de jueves a domingo +12/11/21 1:05 - Beatriz: Dejando mi móvil abala vista...pq todo le atormentaba y no queria +12/11/21 1:05 - Adrian Pitu: Lo distes todo +12/11/21 1:05 - Adrian Pitu: Y mira +12/11/21 1:05 - Beatriz: Mis amigos diciendo ¿Bea? +12/11/21 1:05 - Adrian Pitu: Vaya tela +12/11/21 1:05 - Beatriz: El puente de octubre, de cola le digo vamos a ver tu móvil +12/11/21 1:05 - Adrian Pitu: Un celoso compulsivo +12/11/21 1:05 - Adrian Pitu: Normal y logico +12/11/21 1:05 - Beatriz: Y aparece "Silvi" +12/11/21 1:06 - Beatriz: Quien es? +12/11/21 1:06 - Adrian Pitu: Sorpresa +12/11/21 1:06 - Beatriz: El blanco +12/11/21 1:06 - Beatriz: Una amiga de mi hermana... +12/11/21 1:06 - Beatriz: A ver? Digo yo... +12/11/21 1:06 - Beatriz: Eliminaste este mensaje +12/11/21 1:06 - Beatriz: Eliminaste este mensaje +12/11/21 1:06 - Adrian Pitu: Normal +12/11/21 1:07 - Beatriz: Y leo pasando pantalla a boleo... +12/11/21 1:07 - Beatriz: Cosas cómo +12/11/21 1:07 - Adrian Pitu: Que le preguntaras +12/11/21 1:07 - Adrian Pitu: Lo mas logico +12/11/21 1:07 - Beatriz: Ella; te he puesto falta....no has venido +12/11/21 1:07 - Beatriz: El; he pasado a verte y no estabas... +12/11/21 1:07 - Adrian Pitu: Madremia +12/11/21 1:08 - Beatriz: Una foto de sus rodillas tumbada y pone " liada...adinme pillas ahora" +12/11/21 1:08 - Adrian Pitu: Una conversacion interesante +12/11/21 1:08 - Beatriz: Esto es 10/10 +12/11/21 1:08 - Beatriz: Y el 30/9 leo +12/11/21 1:08 - Beatriz: Ella... +12/11/21 1:08 - Beatriz: CONTRÓLATE +12/11/21 1:08 - Beatriz: El +12/11/21 1:08 - Beatriz: Jooooo +12/11/21 1:08 - Beatriz: Ella +12/11/21 1:08 - Beatriz: Vos ya tomaste una decisión, familia y diversión no puede ser.. +12/11/21 1:08 - Beatriz: El +12/11/21 1:09 - Beatriz: Si, la he tomado.....pero yo quiero ser malo +12/11/21 1:09 - Beatriz: Le digo que no quiero leer más y trato de digerir. +12/11/21 1:10 - Beatriz: Llorando le digo en el coche....si no es lo que pienso, ten cojones y enséñame toda la conversación +12/11/21 1:10 - Beatriz: Y me grita...como jamás había hecho +12/11/21 1:10 - Beatriz: No me sale de los cojones!!! +12/11/21 1:11 - Beatriz: Al día siguiente le digo que se ha acabado y me dice, 24h después que si quiero, que lea +12/11/21 1:11 - Beatriz: Claro... +12/11/21 1:11 - Adrian Pitu: Mal panorama gritando +12/11/21 1:11 - Adrian Pitu: Claro q si +12/11/21 1:11 - Adrian Pitu: Despues de un dia +12/11/21 1:12 - Beatriz: Y mi retina recuerda, de ese whats que de junio a a seotiey que me instaló en su chalet, no hay conversación +12/11/21 1:12 - Beatriz: A septiembre +12/11/21 1:12 - Beatriz: El me dice que es la única conversación que han tenido +12/11/21 1:12 - Adrian Pitu: Ya.. +12/11/21 1:12 - Adrian Pitu: Mentiroso +12/11/21 1:12 - Beatriz: Y le digo ....voy a hablar con tu hermana sobre su amigsy +12/11/21 1:12 - Beatriz: Lo es? +12/11/21 1:13 - Beatriz: No...es una de las camareras de donde suelo ir a a almorzar y comer.... +12/11/21 1:13 - Adrian Pitu: Ahhhhh ya dijo la verdad +12/11/21 1:13 - Adrian Pitu: Pero ya era tarde +12/11/21 1:13 - Beatriz: En serio? +12/11/21 1:14 - Beatriz: Y pq tiene tu móvil? Y le escribes hace 10 días a las 22:30 y te decía que te controles? +12/11/21 1:14 - Adrian Pitu: No sabria ya que decir +12/11/21 1:14 - Adrian Pitu: 😬 +12/11/21 1:15 - Beatriz: Lleva un mes tratando de hacerme creer que es la primera conversación +12/11/21 1:15 - Beatriz: Y tevdce eso? Hay un previo.... obviamente +12/11/21 1:15 - Beatriz: A cojones y directa ni me gana nadie...soy así🤷🏼‍♀️ +12/11/21 1:15 - Beatriz: Hoy he ido al bar +12/11/21 1:16 - Beatriz: Me he presentado +12/11/21 1:16 - Beatriz: He hablado con ella +12/11/21 1:16 - Beatriz: Y me ha dicho....w +12/11/21 1:16 - Adrian Pitu: Tus huevos +12/11/21 1:16 - Beatriz: Que sexo no +12/11/21 1:16 - Adrian Pitu: Que te ha dicho +12/11/21 1:16 - Beatriz: Pero que llevan meses de tonteo que no lleva a nada pero entretiene +12/11/21 1:16 - Adrian Pitu: Claro +12/11/21 1:17 - Beatriz: Que ella le dijo eso cansada pq sabía de mi existencia +12/11/21 1:17 - Adrian Pitu: Entretiene y mucho +12/11/21 1:17 - Adrian Pitu: Estaba el en su salsa +12/11/21 1:17 - Beatriz: Y si...ha borrado conversaciones +12/11/21 1:17 - Beatriz: Que para ella, estando in alguien no procede ese tonteo +12/11/21 1:17 - Adrian Pitu: Lo normal +12/11/21 1:18 - Adrian Pitu: Ella puede decir misa +12/11/21 1:18 - Beatriz: Me ha pedido perdón, pq sin haber pasado de ahí...está mal +12/11/21 1:18 - Adrian Pitu: Algo es algo +12/11/21 1:18 - Beatriz: Ella es libre, pero él no...y le dijo ese CONTRÓLATE +12/11/21 1:18 - Adrian Pitu: Bueno ella tampoco tenia q dar explicaciones +12/11/21 1:19 - Beatriz: Y aun trata de convencerme de que era ella y el nada +12/11/21 1:19 - Beatriz: En fin... +12/11/21 1:19 - Beatriz: Esta arrepentido, claro +12/11/21 1:20 - Beatriz: Pero yo ..he cambiado por él, porque no sufriera....y ha hecho algo que critica en los demás; tontear con una camarera +12/11/21 1:20 - Beatriz: Y aun me dice que tiene su teléfono para pedirle los bocadillos🤣 +12/11/21 1:21 - Beatriz: Uruguaya....y camarera +12/11/21 1:22 - Beatriz: En fin... soy demasiado diva para aguantar eso....más cuando me ha acusado de tener algo contigo!!! Y haberlo tenido que justificar +12/11/21 1:22 - Beatriz: Fuerte, verdad? Increíble.... +12/11/21 1:30 - Beatriz: Que opinas? +12/11/21 1:31 - Beatriz: Que le den, Verdad? Yo un día fui esa camarera...pq él tenía novia +12/11/21 1:32 - Beatriz: Independientemente de lo que puedas opinar como hombre.... conmigo esa diversión, sobra...y más en en este momento de mi vida. No quiero a un hombre que se divierte así... +12/11/21 1:33 - Beatriz: Para eso,me divierto yo teniendo claras las cosas....no? +12/11/21 2:23 - Adrian Pitu: Increible si +12/11/21 2:24 - Adrian Pitu: En resumen que le den +12/11/21 2:27 - Adrian Pitu: Que tu vales mucho como para aguantar todas esas cosas la verdad +12/11/21 7:01 - Beatriz: ☺️ Gracias!😘 +12/11/21 13:32 - Adrian Pitu: Buenos dias madrugadora +12/11/21 13:32 - Adrian Pitu: Me he vuelto a leer toda la conversacion cuando me he despertado +12/11/21 13:32 - Adrian Pitu: Y bueno sorprendido +12/11/21 13:32 - Adrian Pitu: La verdad +12/11/21 13:32 - Beatriz: Bon día trasnochador! +12/11/21 13:33 - Beatriz: Si...pues dice que no es nada, que me he hecho una bola y estoy aprovechando esto para dejarlo y que me quiere y quiere arreglarlo. +12/11/21 13:34 - Beatriz: Hoy por hoy....no estoy por la labor. Por mucho que me guste y le quiera. Yo me quiero mucho más🤷🏼‍♀️ +12/11/21 13:37 - Adrian Pitu: Yo me quedo con la ultima frase +12/11/21 13:37 - Adrian Pitu: Que esa la utilize como ultima frase +12/11/21 13:37 - Adrian Pitu: Yo me quiero mucho mas +12/11/21 13:38 - Adrian Pitu: Aparte una persona es asi de serie +12/11/21 13:38 - Adrian Pitu: Y no cambiara +12/11/21 13:38 - Beatriz: Lo sé... +12/11/21 13:38 - Beatriz: Y me jode +12/11/21 13:40 - Adrian Pitu: Claro +12/11/21 13:41 - Adrian Pitu: Y mas cuando quiere a la persona +12/11/21 13:41 - Adrian Pitu: Pero mira +12/11/21 13:41 - Beatriz: 😔 +12/11/21 13:41 - Beatriz: En fin... +12/11/21 13:41 - Adrian Pitu: La gente nunca deja de sorprender +12/11/21 13:41 - Adrian Pitu: La verdad +12/11/21 13:41 - Adrian Pitu: En fin +12/11/21 14:07 - Adrian Pitu: Ahora nos toca ser felices +12/11/21 15:54 - Beatriz: lo era😟de Verdad +12/11/21 15:56 - Adrian Pitu: Ya +12/11/21 15:56 - Adrian Pitu: Pero ahora tienes q serlo mas todavia +12/11/21 15:57 - Adrian Pitu: Y hacer lo que te de la gana +12/11/21 15:57 - Beatriz: Si +12/11/21 15:59 - Adrian Pitu: Venga que ya es finde +12/11/21 15:59 - Adrian Pitu: Para algunos claro +12/11/21 15:59 - Beatriz: Saliendo estoy del hospital +12/11/21 15:59 - Beatriz: Pfffd +12/11/21 15:59 - Beatriz: Que de faena! +12/11/21 16:08 - Adrian Pitu: Has salido tarde no? +12/11/21 16:08 - Adrian Pitu: Siempre habra +12/11/21 16:18 - Beatriz: Mucha! +12/11/21 16:18 - Beatriz: Siiii +12/11/21 16:29 - Adrian Pitu: Pues ahora a descansar y disfrutar del finde diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 00000000..aacfc4f0 --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,26 @@ +name: Android CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build diff --git a/.gitignore b/.gitignore index f8d94768..03b224d9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ # built application files *.apk *.ap_ -*.jar # files for the dex VM *.dex @@ -38,4 +37,4 @@ android/proguard/ *.iws .idea/ build/ -.gradle \ No newline at end of file +.gradle diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..de57238b --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2018 stfalcon.com + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 0e1e3b38..011249cf 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -[ ![Download](https://api.bintray.com/packages/troy379/maven/ChatKit/images/download.svg) ](https://bintray.com/troy379/maven/ChatKit/_latestVersion) - # ChatKit for Android +[![](https://jitpack.io/v/stfalcon-studio/Chatkit.svg)](https://jitpack.io/#stfalcon-studio/Chatkit) + ChatKit is a library designed to simplify the development of UI for such a trivial task as chat. It has flexible possibilities for styling, customizing and data management

@@ -26,6 +26,10 @@ ChatKit is a library designed to simplify the development of UI for such a trivi ### Who we are Need iOS and Android apps, MVP development or prototyping? Contact us via info@stfalcon.com. We develop software since 2009, and we're known experts in this field. Check out our [portfolio](https://stfalcon.com/en/portfolio) and see more libraries from [stfalcon-studio](https://stfalcon-studio.github.io/). +## Demo Application + +[![Get it on Google Play](https://play.google.com/intl/en_us/badges/images/badge_new.png)](https://play.google.com/store/apps/details?id=com.stfalcon.chatkit.sample) + ### How to use To implement all of the features above you can use the following components: @@ -37,19 +41,50 @@ To implement all of the features above you can use the following components: ### Download -Download via Gradle: -```gradle -compile 'com.github.stfalcon:chatkit:0.2.0' +1. Add jitpack to the root build.gradle file of your project at the end of repositories. +``` +allprojects { + repositories { + ... + maven { url 'https://jitpack.io' } + } +} +``` +2. Add the dependency +[![](https://jitpack.io/v/stfalcon-studio/Chatkit.svg)](https://jitpack.io/#stfalcon-studio/Chatkit) +``` +dependencies { + ... + implementation 'com.github.stfalcon-studio:Chatkit:[last_version]' +} ``` -or Maven: -```xml - - com.github.stfalcon - chatkit - 0.2.0 - pom - +### AndroidX +To use with AndroidX you have to set targetSdkVersion for your project to 28 and add following 2 lines in ```gradle.properties``` file. +``` +android.useAndroidX=true +android.enableJetifier=true +``` + +### Proguard +If you are using ProGuard you might need to add rules: +``` +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingTextMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingTextMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingImageMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingImageMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } ``` ### Try it @@ -75,7 +110,7 @@ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 +https://github.com/stfalcon-studio/ChatKit/blob/master/LICENSE Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, diff --git a/build.gradle b/build.gradle index 3c9f496e..9c349992 100644 --- a/build.gradle +++ b/build.gradle @@ -3,19 +3,22 @@ buildscript { repositories { jcenter() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.1' - classpath 'com.novoda:bintray-release:0.4.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + classpath 'com.android.tools.build:gradle:4.1.2' } } +plugins { + id 'maven-publish' +} + allprojects { repositories { jcenter() + google() + maven { url "https://jitpack.io" } } } diff --git a/chatkit/build.gradle b/chatkit/build.gradle index db17162b..ad99aae0 100644 --- a/chatkit/build.gradle +++ b/chatkit/build.gradle @@ -1,16 +1,14 @@ apply plugin: 'com.android.library' -apply plugin: 'com.novoda.bintray-release' +apply plugin: 'maven-publish' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 29 + buildToolsVersion '29.0.2' defaultConfig { - minSdkVersion 16 - targetSdkVersion 25 + minSdkVersion 14 versionCode 1 - versionName "0.2.0" - + versionName '0.4.1' consumerProguardFiles 'proguard.txt' } android { @@ -18,22 +16,35 @@ android { abortOnError false } } -} -publish { - groupId = 'com.github.stfalcon' - artifactId = 'chatkit' - publishVersion = '0.2.0' - desc = 'ChatKit - is a library designed to simplify the development of UI for such a trivial task as chat. It have flexible possibilities for styling, customizing and data management' - licences = ['Apache-2.0'] - uploadName = 'ChatKit' - website = 'https://github.com/stfalcon-studio/ChatKit.git' + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + afterEvaluate { + publishing { + publications { + // Creates a Maven publication called "release". + release(MavenPublication) { + // Applies the component for the release build variant. + from components.release + + // You can then customize attributes of the publication as shown below. + groupId = 'com.github.stfalcon' + artifactId = 'chatkit' + version = '0.4.1' + } + } + } + } } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.1.1' - compile 'com.android.support:design:25.1.1' - compile 'com.google.android:flexbox:0.2.5' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.2.1' + implementation "com.google.android:flexbox:1.0.0" + implementation 'androidx.recyclerview:recyclerview:1.1.0' } diff --git a/chatkit/src/main/AndroidManifest.xml b/chatkit/src/main/AndroidManifest.xml index 9f22fb31..e3238ed8 100644 --- a/chatkit/src/main/AndroidManifest.xml +++ b/chatkit/src/main/AndroidManifest.xml @@ -1,8 +1,3 @@ - - - + diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java index 4d795854..bfcfeb78 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ImageLoader.java @@ -18,11 +18,13 @@ import android.widget.ImageView; +import androidx.annotation.Nullable; + /** * Callback for implementing images loading in message list */ public interface ImageLoader { - void loadImage(ImageView imageView, String url); + void loadImage(ImageView imageView, @Nullable String url, @Nullable Object payload); } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/Style.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/Style.java index fcbd8a77..c69511a3 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/Style.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/Style.java @@ -20,14 +20,15 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; -import android.support.annotation.AttrRes; -import android.support.annotation.ColorRes; -import android.support.annotation.DimenRes; -import android.support.annotation.DrawableRes; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; import android.util.TypedValue; +import androidx.annotation.AttrRes; +import androidx.annotation.ColorRes; +import androidx.annotation.DimenRes; +import androidx.annotation.DrawableRes; +import androidx.core.content.ContextCompat; + import com.stfalcon.chatkit.R; /** diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ViewHolder.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ViewHolder.java index dff3193c..c92d5213 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/ViewHolder.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/ViewHolder.java @@ -16,9 +16,10 @@ package com.stfalcon.chatkit.commons; -import android.support.v7.widget.RecyclerView; import android.view.View; +import androidx.recyclerview.widget.RecyclerView; + /** * Base ViewHolder */ diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java index d51c2081..d4c621a0 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/IUser.java @@ -25,20 +25,20 @@ public interface IUser { * Returns the user's id * * @return the user's id - * */ + */ String getId(); /** * Returns the user's name * * @return the user's name - * */ + */ String getName(); /** * Returns the user's avatar image url * * @return the user's avatar image url - * */ + */ String getAvatar(); } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/MessageContentType.java b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/MessageContentType.java index 943623c1..cb33dd6c 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/MessageContentType.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/commons/models/MessageContentType.java @@ -1,5 +1,23 @@ +/******************************************************************************* + * Copyright 2016 stfalcon.com + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *******************************************************************************/ + package com.stfalcon.chatkit.commons.models; +import androidx.annotation.Nullable; + import com.stfalcon.chatkit.messages.MessageHolders; /* @@ -16,6 +34,7 @@ public interface MessageContentType extends IMessage { * Default media type for image message. */ interface Image extends IMessage { + @Nullable String getImageUrl(); } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogListStyle.java b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogListStyle.java index 539d3227..b8ea3eca 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogListStyle.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogListStyle.java @@ -27,7 +27,7 @@ /** * Style for DialogList customization by xml attributes */ - +@SuppressWarnings("WeakerAccess") class DialogListStyle extends Style { private int dialogTitleTextColor; @@ -75,75 +75,79 @@ static DialogListStyle parse(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DialogsList); //Item background - style.setDialogItemBackground(typedArray.getColor(R.styleable.DialogsList_dialogItemBackground, - style.getColor(R.color.transparent))); - style.setDialogUnreadItemBackground(typedArray.getColor(R.styleable.DialogsList_dialogUnreadItemBackground, - style.getColor(R.color.transparent))); + style.dialogItemBackground = typedArray.getColor(R.styleable.DialogsList_dialogItemBackground, + style.getColor(R.color.transparent)); + style.dialogUnreadItemBackground = typedArray.getColor(R.styleable.DialogsList_dialogUnreadItemBackground, + style.getColor(R.color.transparent)); + //Title text - style.setDialogTitleTextColor(typedArray.getColor(R.styleable.DialogsList_dialogTitleTextColor, - style.getColor(R.color.dialog_title_text))); - style.setDialogTitleTextSize(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogTitleTextSize, - context.getResources().getDimensionPixelSize(R.dimen.dialog_title_text_size))); - style.setDialogTitleTextStyle(typedArray.getInt(R.styleable.DialogsList_dialogTitleTextStyle, Typeface.NORMAL)); + style.dialogTitleTextColor = typedArray.getColor(R.styleable.DialogsList_dialogTitleTextColor, + style.getColor(R.color.dialog_title_text)); + style.dialogTitleTextSize = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogTitleTextSize, + context.getResources().getDimensionPixelSize(R.dimen.dialog_title_text_size)); + style.dialogTitleTextStyle = typedArray.getInt(R.styleable.DialogsList_dialogTitleTextStyle, Typeface.NORMAL); + //Title unread text - style.setDialogUnreadTitleTextColor(typedArray.getColor(R.styleable.DialogsList_dialogUnreadTitleTextColor, - style.getColor(R.color.dialog_title_text))); - style.setDialogUnreadTitleTextStyle(typedArray.getInt(R.styleable.DialogsList_dialogUnreadTitleTextStyle, Typeface.NORMAL)); + style.dialogUnreadTitleTextColor = typedArray.getColor(R.styleable.DialogsList_dialogUnreadTitleTextColor, + style.getColor(R.color.dialog_title_text)); + style.dialogUnreadTitleTextStyle = typedArray.getInt(R.styleable.DialogsList_dialogUnreadTitleTextStyle, Typeface.NORMAL); //Message text - style.setDialogMessageTextColor(typedArray.getColor(R.styleable.DialogsList_dialogMessageTextColor, - style.getColor(R.color.dialog_message_text))); - style.setDialogMessageTextSize(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageTextSize, - context.getResources().getDimensionPixelSize(R.dimen.dialog_message_text_size))); - style.setDialogMessageTextStyle(typedArray.getInt(R.styleable.DialogsList_dialogMessageTextStyle, Typeface.NORMAL)); + style.dialogMessageTextColor = typedArray.getColor(R.styleable.DialogsList_dialogMessageTextColor, + style.getColor(R.color.dialog_message_text)); + style.dialogMessageTextSize = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageTextSize, + context.getResources().getDimensionPixelSize(R.dimen.dialog_message_text_size)); + style.dialogMessageTextStyle = typedArray.getInt(R.styleable.DialogsList_dialogMessageTextStyle, Typeface.NORMAL); + //Message unread text - style.setDialogUnreadMessageTextColor(typedArray.getColor(R.styleable.DialogsList_dialogUnreadMessageTextColor, - style.getColor(R.color.dialog_message_text))); - style.setDialogUnreadMessageTextStyle(typedArray.getInt(R.styleable.DialogsList_dialogUnreadMessageTextStyle, Typeface.NORMAL)); + style.dialogUnreadMessageTextColor = typedArray.getColor(R.styleable.DialogsList_dialogUnreadMessageTextColor, + style.getColor(R.color.dialog_message_text)); + style.dialogUnreadMessageTextStyle = typedArray.getInt(R.styleable.DialogsList_dialogUnreadMessageTextStyle, Typeface.NORMAL); //Date text - style.setDialogDateColor(typedArray.getColor(R.styleable.DialogsList_dialogDateColor, - style.getColor(R.color.dialog_date_text))); - style.setDialogDateSize(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDateSize, - context.getResources().getDimensionPixelSize(R.dimen.dialog_date_text_size))); - style.setDialogDateStyle(typedArray.getInt(R.styleable.DialogsList_dialogDateStyle, Typeface.NORMAL)); + style.dialogDateColor = typedArray.getColor(R.styleable.DialogsList_dialogDateColor, + style.getColor(R.color.dialog_date_text)); + style.dialogDateSize = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDateSize, + context.getResources().getDimensionPixelSize(R.dimen.dialog_date_text_size)); + style.dialogDateStyle = typedArray.getInt(R.styleable.DialogsList_dialogDateStyle, Typeface.NORMAL); + //Date unread text - style.setDialogUnreadDateColor(typedArray.getColor(R.styleable.DialogsList_dialogUnreadDateColor, - style.getColor(R.color.dialog_date_text))); - style.setDialogUnreadDateStyle(typedArray.getInt(R.styleable.DialogsList_dialogUnreadDateStyle, Typeface.NORMAL)); + style.dialogUnreadDateColor = typedArray.getColor(R.styleable.DialogsList_dialogUnreadDateColor, + style.getColor(R.color.dialog_date_text)); + style.dialogUnreadDateStyle = typedArray.getInt(R.styleable.DialogsList_dialogUnreadDateStyle, Typeface.NORMAL); //Unread bubble - style.setDialogUnreadBubbleEnabled(typedArray.getBoolean(R.styleable.DialogsList_dialogUnreadBubbleEnabled, true)); - style.setDialogUnreadBubbleBackgroundColor(typedArray.getColor(R.styleable.DialogsList_dialogUnreadBubbleBackgroundColor, - style.getColor(R.color.dialog_unread_bubble))); + style.dialogUnreadBubbleEnabled = typedArray.getBoolean(R.styleable.DialogsList_dialogUnreadBubbleEnabled, true); + style.dialogUnreadBubbleBackgroundColor = typedArray.getColor(R.styleable.DialogsList_dialogUnreadBubbleBackgroundColor, + style.getColor(R.color.dialog_unread_bubble)); //Unread bubble text - style.setDialogUnreadBubbleTextColor(typedArray.getColor(R.styleable.DialogsList_dialogUnreadBubbleTextColor, - style.getColor(R.color.dialog_unread_text))); - style.setDialogUnreadBubbleTextSize(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogUnreadBubbleTextSize, - context.getResources().getDimensionPixelSize(R.dimen.dialog_unread_bubble_text_size))); - style.setDialogUnreadBubbleTextStyle(typedArray.getInt(R.styleable.DialogsList_dialogUnreadBubbleTextStyle, Typeface.NORMAL)); + style.dialogUnreadBubbleTextColor = typedArray.getColor(R.styleable.DialogsList_dialogUnreadBubbleTextColor, + style.getColor(R.color.dialog_unread_text)); + style.dialogUnreadBubbleTextSize = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogUnreadBubbleTextSize, + context.getResources().getDimensionPixelSize(R.dimen.dialog_unread_bubble_text_size)); + style.dialogUnreadBubbleTextStyle = typedArray.getInt(R.styleable.DialogsList_dialogUnreadBubbleTextStyle, Typeface.NORMAL); //Avatar - style.setDialogAvatarWidth(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogAvatarWidth, - context.getResources().getDimensionPixelSize(R.dimen.dialog_avatar_width))); - style.setDialogAvatarHeight(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogAvatarHeight, - context.getResources().getDimensionPixelSize(R.dimen.dialog_avatar_height))); + style.dialogAvatarWidth = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogAvatarWidth, + context.getResources().getDimensionPixelSize(R.dimen.dialog_avatar_width)); + style.dialogAvatarHeight = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogAvatarHeight, + context.getResources().getDimensionPixelSize(R.dimen.dialog_avatar_height)); //Last message avatar - style.setDialogMessageAvatarEnabled(typedArray.getBoolean(R.styleable.DialogsList_dialogMessageAvatarEnabled, true)); - style.setDialogMessageAvatarWidth(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageAvatarWidth, - context.getResources().getDimensionPixelSize(R.dimen.dialog_last_message_avatar_width))); - style.setDialogMessageAvatarHeight(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageAvatarHeight, - context.getResources().getDimensionPixelSize(R.dimen.dialog_last_message_avatar_height))); + style.dialogMessageAvatarEnabled = typedArray.getBoolean(R.styleable.DialogsList_dialogMessageAvatarEnabled, true); + style.dialogMessageAvatarWidth = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageAvatarWidth, + context.getResources().getDimensionPixelSize(R.dimen.dialog_last_message_avatar_width)); + style.dialogMessageAvatarHeight = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogMessageAvatarHeight, + context.getResources().getDimensionPixelSize(R.dimen.dialog_last_message_avatar_height)); //Divider - style.setDialogDividerEnabled(typedArray.getBoolean(R.styleable.DialogsList_dialogDividerEnabled, true)); - style.setDialogDividerColor(typedArray.getColor(R.styleable.DialogsList_dialogDividerColor, style.getColor(R.color.dialog_divider))); - style.setDialogDividerLeftPadding(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDividerLeftPadding, - context.getResources().getDimensionPixelSize(R.dimen.dialog_divider_margin_left))); - style.setDialogDividerRightPadding(typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDividerRightPadding, - context.getResources().getDimensionPixelSize(R.dimen.dialog_divider_margin_right))); + style.dialogDividerEnabled = typedArray.getBoolean(R.styleable.DialogsList_dialogDividerEnabled, true); + style.dialogDividerColor = typedArray.getColor(R.styleable.DialogsList_dialogDividerColor, style.getColor(R.color.dialog_divider)); + style.dialogDividerLeftPadding = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDividerLeftPadding, + context.getResources().getDimensionPixelSize(R.dimen.dialog_divider_margin_left)); + style.dialogDividerRightPadding = typedArray.getDimensionPixelSize(R.styleable.DialogsList_dialogDividerRightPadding, + context.getResources().getDimensionPixelSize(R.dimen.dialog_divider_margin_right)); typedArray.recycle(); @@ -154,251 +158,127 @@ private DialogListStyle(Context context, AttributeSet attrs) { super(context, attrs); } - int getDialogTitleTextColor() { + protected int getDialogTitleTextColor() { return dialogTitleTextColor; } - void setDialogTitleTextColor(int dialogTitleTextColor) { - this.dialogTitleTextColor = dialogTitleTextColor; - } - - int getDialogTitleTextSize() { + protected int getDialogTitleTextSize() { return dialogTitleTextSize; } - void setDialogTitleTextSize(int dialogTitleTextSize) { - this.dialogTitleTextSize = dialogTitleTextSize; - } - - int getDialogTitleTextStyle() { + protected int getDialogTitleTextStyle() { return dialogTitleTextStyle; } - void setDialogTitleTextStyle(int dialogTitleTextStyle) { - this.dialogTitleTextStyle = dialogTitleTextStyle; - } - - int getDialogUnreadTitleTextColor() { + protected int getDialogUnreadTitleTextColor() { return dialogUnreadTitleTextColor; } - void setDialogUnreadTitleTextColor(int dialogUnreadTitleTextColor) { - this.dialogUnreadTitleTextColor = dialogUnreadTitleTextColor; - } - - int getDialogUnreadTitleTextStyle() { + protected int getDialogUnreadTitleTextStyle() { return dialogUnreadTitleTextStyle; } - void setDialogUnreadTitleTextStyle(int dialogUnreadTitleTextStyle) { - this.dialogUnreadTitleTextStyle = dialogUnreadTitleTextStyle; - } - - int getDialogMessageTextColor() { + protected int getDialogMessageTextColor() { return dialogMessageTextColor; } - void setDialogMessageTextColor(int dialogMessageTextColor) { - this.dialogMessageTextColor = dialogMessageTextColor; - } - - int getDialogMessageTextSize() { + protected int getDialogMessageTextSize() { return dialogMessageTextSize; } - void setDialogMessageTextSize(int dialogMessageTextSize) { - this.dialogMessageTextSize = dialogMessageTextSize; - } - - int getDialogMessageTextStyle() { + protected int getDialogMessageTextStyle() { return dialogMessageTextStyle; } - void setDialogMessageTextStyle(int dialogMessageTextStyle) { - this.dialogMessageTextStyle = dialogMessageTextStyle; - } - - int getDialogUnreadMessageTextColor() { + protected int getDialogUnreadMessageTextColor() { return dialogUnreadMessageTextColor; } - void setDialogUnreadMessageTextColor(int dialogUnreadMessageTextColor) { - this.dialogUnreadMessageTextColor = dialogUnreadMessageTextColor; - } - - int getDialogUnreadMessageTextStyle() { + protected int getDialogUnreadMessageTextStyle() { return dialogUnreadMessageTextStyle; } - void setDialogUnreadMessageTextStyle(int dialogUnreadMessageTextStyle) { - this.dialogUnreadMessageTextStyle = dialogUnreadMessageTextStyle; - } - - int getDialogDateColor() { + protected int getDialogDateColor() { return dialogDateColor; } - void setDialogDateColor(int dialogDateColor) { - this.dialogDateColor = dialogDateColor; - } - - int getDialogDateSize() { + protected int getDialogDateSize() { return dialogDateSize; } - void setDialogDateSize(int dialogDateSize) { - this.dialogDateSize = dialogDateSize; - } - - int getDialogDateStyle() { + protected int getDialogDateStyle() { return dialogDateStyle; } - void setDialogDateStyle(int dialogDateStyle) { - this.dialogDateStyle = dialogDateStyle; - } - - int getDialogUnreadDateColor() { + protected int getDialogUnreadDateColor() { return dialogUnreadDateColor; } - void setDialogUnreadDateColor(int dialogUnreadDateColor) { - this.dialogUnreadDateColor = dialogUnreadDateColor; - } - - int getDialogUnreadDateStyle() { + protected int getDialogUnreadDateStyle() { return dialogUnreadDateStyle; } - void setDialogUnreadDateStyle(int dialogUnreadDateStyle) { - this.dialogUnreadDateStyle = dialogUnreadDateStyle; - } - - boolean isDialogUnreadBubbleEnabled() { + protected boolean isDialogUnreadBubbleEnabled() { return dialogUnreadBubbleEnabled; } - void setDialogUnreadBubbleEnabled(boolean dialogUnreadBubbleEnabled) { - this.dialogUnreadBubbleEnabled = dialogUnreadBubbleEnabled; - } - - int getDialogUnreadBubbleTextColor() { + protected int getDialogUnreadBubbleTextColor() { return dialogUnreadBubbleTextColor; } - void setDialogUnreadBubbleTextColor(int dialogUnreadBubbleTextColor) { - this.dialogUnreadBubbleTextColor = dialogUnreadBubbleTextColor; - } - - int getDialogUnreadBubbleTextSize() { + protected int getDialogUnreadBubbleTextSize() { return dialogUnreadBubbleTextSize; } - void setDialogUnreadBubbleTextSize(int dialogUnreadBubbleTextSize) { - this.dialogUnreadBubbleTextSize = dialogUnreadBubbleTextSize; - } - - int getDialogUnreadBubbleTextStyle() { + protected int getDialogUnreadBubbleTextStyle() { return dialogUnreadBubbleTextStyle; } - void setDialogUnreadBubbleTextStyle(int dialogUnreadBubbleTextStyle) { - this.dialogUnreadBubbleTextStyle = dialogUnreadBubbleTextStyle; - } - - int getDialogUnreadBubbleBackgroundColor() { + protected int getDialogUnreadBubbleBackgroundColor() { return dialogUnreadBubbleBackgroundColor; } - void setDialogUnreadBubbleBackgroundColor(int dialogUnreadBubbleBackgroundColor) { - this.dialogUnreadBubbleBackgroundColor = dialogUnreadBubbleBackgroundColor; - } - - int getDialogAvatarWidth() { + protected int getDialogAvatarWidth() { return dialogAvatarWidth; } - void setDialogAvatarWidth(int dialogAvatarWidth) { - this.dialogAvatarWidth = dialogAvatarWidth; - } - - int getDialogAvatarHeight() { + protected int getDialogAvatarHeight() { return dialogAvatarHeight; } - void setDialogAvatarHeight(int dialogAvatarHeight) { - this.dialogAvatarHeight = dialogAvatarHeight; - } - - boolean isDialogDividerEnabled() { + protected boolean isDialogDividerEnabled() { return dialogDividerEnabled; } - void setDialogDividerEnabled(boolean dialogDividerEnabled) { - this.dialogDividerEnabled = dialogDividerEnabled; - } - - int getDialogDividerColor() { + protected int getDialogDividerColor() { return dialogDividerColor; } - void setDialogDividerColor(int dialogDividerColor) { - this.dialogDividerColor = dialogDividerColor; - } - - int getDialogDividerLeftPadding() { + protected int getDialogDividerLeftPadding() { return dialogDividerLeftPadding; } - void setDialogDividerLeftPadding(int dialogDividerLeftMargin) { - this.dialogDividerLeftPadding = dialogDividerLeftMargin; - } - - int getDialogDividerRightPadding() { + protected int getDialogDividerRightPadding() { return dialogDividerRightPadding; } - void setDialogDividerRightPadding(int dialogDividerRightMargin) { - this.dialogDividerRightPadding = dialogDividerRightMargin; - } - - int getDialogItemBackground() { + protected int getDialogItemBackground() { return dialogItemBackground; } - void setDialogItemBackground(int dialogItemBackground) { - this.dialogItemBackground = dialogItemBackground; - } - - int getDialogUnreadItemBackground() { + protected int getDialogUnreadItemBackground() { return dialogUnreadItemBackground; } - void setDialogUnreadItemBackground(int dialogUnreadItemBackground) { - this.dialogUnreadItemBackground = dialogUnreadItemBackground; - } - - void setDialogMessageAvatarEnabled(boolean dialogMessageAvatarEnabled) { - this.dialogMessageAvatarEnabled = dialogMessageAvatarEnabled; - } - - boolean isDialogMessageAvatarEnabled() { + protected boolean isDialogMessageAvatarEnabled() { return dialogMessageAvatarEnabled; } - int getDialogMessageAvatarWidth() { + protected int getDialogMessageAvatarWidth() { return dialogMessageAvatarWidth; } - void setDialogMessageAvatarWidth(int dialogMessageAvatarWidth) { - this.dialogMessageAvatarWidth = dialogMessageAvatarWidth; - } - - int getDialogMessageAvatarHeight() { + protected int getDialogMessageAvatarHeight() { return dialogMessageAvatarHeight; } - - void setDialogMessageAvatarHeight(int dialogMessageAvatarHeight) { - this.dialogMessageAvatarHeight = dialogMessageAvatarHeight; - } } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsList.java b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsList.java index 4ad4aab1..cf2448cb 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsList.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsList.java @@ -17,13 +17,14 @@ package com.stfalcon.chatkit.dialogs; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SimpleItemAnimator; import android.util.AttributeSet; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + import com.stfalcon.chatkit.commons.models.IDialog; /** @@ -68,17 +69,30 @@ public void setAdapter(Adapter adapter) { } /** - * Set adapter for DialogsList + * Sets adapter for DialogsList * * @param adapter Adapter. Must extend DialogsListAdapter * @param

Dialog model class */ - public void setAdapter(DialogsListAdapter adapter) { + public > + void setAdapter(DialogsListAdapter adapter) { + setAdapter(adapter, false); + } + + /** + * Sets adapter for DialogsList + * + * @param adapter Adapter. Must extend DialogsListAdapter + * @param reverseLayout weather to use reverse layout for layout manager. + * @param Dialog model class + */ + public > + void setAdapter(DialogsListAdapter adapter, boolean reverseLayout) { SimpleItemAnimator itemAnimator = new DefaultItemAnimator(); itemAnimator.setSupportsChangeAnimations(false); LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), - LinearLayoutManager.VERTICAL, true); + LinearLayoutManager.VERTICAL, reverseLayout); setItemAnimator(itemAnimator); setLayoutManager(layoutManager); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java index 87a10784..147fda0e 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/dialogs/DialogsListAdapter.java @@ -1,4 +1,4 @@ -/******************************************************************************* +/****************************************************************************** * Copyright 2016 stfalcon.com *

* Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,9 +16,8 @@ package com.stfalcon.chatkit.dialogs; +import android.graphics.Typeface; import android.graphics.drawable.GradientDrawable; -import android.support.annotation.LayoutRes; -import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; @@ -26,6 +25,10 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + import com.stfalcon.chatkit.R; import com.stfalcon.chatkit.commons.ImageLoader; import com.stfalcon.chatkit.commons.ViewHolder; @@ -46,15 +49,18 @@ /** * Adapter for {@link DialogsList} */ +@SuppressWarnings("WeakerAccess") public class DialogsListAdapter

extends RecyclerView.Adapter { - private List items = new ArrayList<>(); + protected List items = new ArrayList<>(); private int itemLayoutId; private Class holderClass; private ImageLoader imageLoader; private OnDialogClickListener onDialogClickListener; + private OnDialogViewClickListener onDialogViewClickListener; private OnDialogLongClickListener onLongItemClickListener; + private OnDialogViewLongClickListener onDialogViewLongClickListener; private DialogListStyle dialogStyle; private DateFormatter.Formatter datesFormatter; @@ -96,7 +102,9 @@ public DialogsListAdapter(@LayoutRes int itemLayoutId, Class newItems) { */ public void addItem(DIALOG dialog) { items.add(dialog); - notifyItemInserted(0); + notifyItemInserted(items.size() - 1); } /** * Add dialog to dialogs list * * @param dialog dialog item - * @param position position in dialogs lost + * @param position position in dialogs list */ public void addItem(int position, DIALOG dialog) { items.add(position, dialog); notifyItemInserted(position); } + /** + * Move an item + * + * @param fromPosition the actual position of the item + * @param toPosition the new position of the item + */ + public void moveItem(int fromPosition, int toPosition) { + DIALOG dialog = items.remove(fromPosition); + items.add(toPosition, dialog); + notifyItemMoved(fromPosition, toPosition); + } + /** * Update dialog by position in dialogs list * @@ -239,6 +259,47 @@ public void updateItemById(DIALOG item) { } } + /** + * Upsert dialog in dialogs list or add it to then end of dialogs list + * + * @param item dialog item + */ + public void upsertItem(DIALOG item) { + boolean updated = false; + for (int i = 0; i < items.size(); i++) { + if (items.get(i).getId().equals(item.getId())) { + items.set(i, item); + notifyItemChanged(i); + updated = true; + break; + } + } + if (!updated) { + addItem(item); + } + } + + /** + * Find an item by its id + * + * @param id the wanted item's id + * @return the found item, or null + */ + @Nullable + public DIALOG getItemById(String id) { + if (items == null) { + items = new ArrayList<>(); + } + for (DIALOG item : items) { + if (item.getId() == null && id == null) { + return item; + } else if (item.getId() != null && item.getId().equals(id)) { + return item; + } + } + return null; + } + /** * Update last message in dialog and swap item to top of list. * @@ -246,6 +307,7 @@ public void updateItemById(DIALOG item) { * @param message New message * @return false if dialog doesn't exist. */ + @SuppressWarnings("unchecked") public boolean updateDialogWithMessage(String dialogId, IMessage message) { boolean dialogExist = false; for (int i = 0; i < items.size(); i++) { @@ -267,15 +329,12 @@ public boolean updateDialogWithMessage(String dialogId, IMessage message) { * Sort dialog by last message date */ public void sortByLastMessageDate() { - Collections.sort(items, new Comparator() { - @Override - public int compare(DIALOG o1, DIALOG o2) { - if (o1.getLastMessage().getCreatedAt().after(o2.getLastMessage().getCreatedAt())) { - return -1; - } else if (o1.getLastMessage().getCreatedAt().before(o2.getLastMessage().getCreatedAt())) { - return 1; - } else return 0; - } + Collections.sort(items, (o1, o2) -> { + if (o1.getLastMessage().getCreatedAt().after(o2.getLastMessage().getCreatedAt())) { + return -1; + } else if (o1.getLastMessage().getCreatedAt().before(o2.getLastMessage().getCreatedAt())) { + return 1; + } else return 0; }); notifyDataSetChanged(); } @@ -290,6 +349,13 @@ public void sort(Comparator comparator) { notifyDataSetChanged(); } + /** + * @return registered image loader + */ + public ImageLoader getImageLoader() { + return imageLoader; + } + /** * Register a callback to be invoked when image need to load. * @@ -300,14 +366,7 @@ public void setImageLoader(ImageLoader imageLoader) { } /** - * @return registered image loader - */ - public ImageLoader getImageLoader() { - return imageLoader; - } - - /** - * @return the on click callback registered for this view. + * @return the item click callback. */ public OnDialogClickListener getOnDialogClickListener() { return onDialogClickListener; @@ -322,6 +381,22 @@ public void setOnDialogClickListener(OnDialogClickListener onDialogClick this.onDialogClickListener = onDialogClickListener; } + /** + * @return the view click callback. + */ + public OnDialogViewClickListener getOnDialogViewClickListener() { + return onDialogViewClickListener; + } + + /** + * Register a callback to be invoked when dialog view is clicked. + * + * @param clickListener on click item callback + */ + public void setOnDialogViewClickListener(OnDialogViewClickListener clickListener) { + this.onDialogViewClickListener = clickListener; + } + /** * @return on long click item callback */ @@ -338,6 +413,22 @@ public void setOnDialogLongClickListener(OnDialogLongClickListener onLon this.onLongItemClickListener = onLongItemClickListener; } + /** + * @return on view long click callback + */ + public OnDialogViewLongClickListener getOnDialogViewLongClickListener() { + return onDialogViewLongClickListener; + } + + /** + * Register a callback to be invoked when item view is long clicked. + * + * @param clickListener on long click item callback + */ + public void setOnDialogViewLongClickListener(OnDialogViewLongClickListener clickListener) { + this.onDialogViewLongClickListener = clickListener; + } + /** * Sets custom {@link DateFormatter.Formatter} for text representation of last message date. */ @@ -350,26 +441,43 @@ void setStyle(DialogListStyle dialogStyle) { this.dialogStyle = dialogStyle; } + /** + * @return the position of a dialog in the dialogs list. + */ + public int getDialogPosition(DIALOG dialog) { + return this.items.indexOf(dialog); + } + /* - * LISTENERS - * */ + * LISTENERS + * */ public interface OnDialogClickListener { void onDialogClick(DIALOG dialog); } + public interface OnDialogViewClickListener { + void onDialogViewClick(View view, DIALOG dialog); + } + public interface OnDialogLongClickListener { void onDialogLongClick(DIALOG dialog); } + public interface OnDialogViewLongClickListener { + void onDialogViewLongClick(View view, DIALOG dialog); + } + /* - * HOLDERS - * */ + * HOLDERS + * */ public abstract static class BaseDialogViewHolder extends ViewHolder { protected ImageLoader imageLoader; - protected OnDialogClickListener onDialogClickListener; - protected OnDialogLongClickListener onLongItemClickListener; + protected OnDialogClickListener onDialogClickListener; + protected OnDialogLongClickListener onLongItemClickListener; + protected OnDialogViewClickListener onDialogViewClickListener; + protected OnDialogViewLongClickListener onDialogViewLongClickListener; protected DateFormatter.Formatter datesFormatter; public BaseDialogViewHolder(View itemView) { @@ -380,14 +488,22 @@ void setImageLoader(ImageLoader imageLoader) { this.imageLoader = imageLoader; } - void setOnDialogClickListener(OnDialogClickListener onDialogClickListener) { + protected void setOnDialogClickListener(OnDialogClickListener onDialogClickListener) { this.onDialogClickListener = onDialogClickListener; } - void setOnLongItemClickListener(OnDialogLongClickListener onLongItemClickListener) { + protected void setOnDialogViewClickListener(OnDialogViewClickListener onDialogViewClickListener) { + this.onDialogViewClickListener = onDialogViewClickListener; + } + + protected void setOnLongItemClickListener(OnDialogLongClickListener onLongItemClickListener) { this.onLongItemClickListener = onLongItemClickListener; } + protected void setOnDialogViewLongClickListener(OnDialogViewLongClickListener onDialogViewLongClickListener) { + this.onDialogViewLongClickListener = onDialogViewLongClickListener; + } + public void setDatesFormatter(DateFormatter.Formatter dateHeadersFormatter) { this.datesFormatter = dateHeadersFormatter; } @@ -408,15 +524,15 @@ public static class DialogViewHolder extends BaseDialogV public DialogViewHolder(View itemView) { super(itemView); - root = (ViewGroup) itemView.findViewById(R.id.dialogRootLayout); - container = (ViewGroup) itemView.findViewById(R.id.dialogContainer); - tvName = (TextView) itemView.findViewById(R.id.dialogName); - tvDate = (TextView) itemView.findViewById(R.id.dialogDate); - tvLastMessage = (TextView) itemView.findViewById(R.id.dialogLastMessage); - tvBubble = (TextView) itemView.findViewById(R.id.dialogUnreadBubble); - ivLastMessageUser = (ImageView) itemView.findViewById(R.id.dialogLastMessageUserAvatar); - ivAvatar = (ImageView) itemView.findViewById(R.id.dialogAvatar); - dividerContainer = (ViewGroup) itemView.findViewById(R.id.dialogDividerContainer); + root = itemView.findViewById(R.id.dialogRootLayout); + container = itemView.findViewById(R.id.dialogContainer); + tvName = itemView.findViewById(R.id.dialogName); + tvDate = itemView.findViewById(R.id.dialogDate); + tvLastMessage = itemView.findViewById(R.id.dialogLastMessage); + tvBubble = itemView.findViewById(R.id.dialogUnreadBubble); + ivLastMessageUser = itemView.findViewById(R.id.dialogLastMessageUserAvatar); + ivAvatar = itemView.findViewById(R.id.dialogAvatar); + dividerContainer = itemView.findViewById(R.id.dialogDividerContainer); divider = itemView.findViewById(R.id.dialogDivider); } @@ -475,17 +591,17 @@ private void applyDefaultStyle() { if (tvName != null) { tvName.setTextColor(dialogStyle.getDialogTitleTextColor()); - tvName.setTypeface(tvName.getTypeface(), dialogStyle.getDialogTitleTextStyle()); + tvName.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogTitleTextStyle()); } if (tvDate != null) { tvDate.setTextColor(dialogStyle.getDialogDateColor()); - tvDate.setTypeface(tvDate.getTypeface(), dialogStyle.getDialogDateStyle()); + tvDate.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogDateStyle()); } if (tvLastMessage != null) { tvLastMessage.setTextColor(dialogStyle.getDialogMessageTextColor()); - tvLastMessage.setTypeface(tvLastMessage.getTypeface(), dialogStyle.getDialogMessageTextStyle()); + tvLastMessage.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogMessageTextStyle()); } } } @@ -498,17 +614,17 @@ private void applyUnreadStyle() { if (tvName != null) { tvName.setTextColor(dialogStyle.getDialogUnreadTitleTextColor()); - tvName.setTypeface(tvName.getTypeface(), dialogStyle.getDialogUnreadTitleTextStyle()); + tvName.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogUnreadTitleTextStyle()); } if (tvDate != null) { tvDate.setTextColor(dialogStyle.getDialogUnreadDateColor()); - tvDate.setTypeface(tvDate.getTypeface(), dialogStyle.getDialogUnreadDateStyle()); + tvDate.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogUnreadDateStyle()); } if (tvLastMessage != null) { tvLastMessage.setTextColor(dialogStyle.getDialogUnreadMessageTextColor()); - tvLastMessage.setTypeface(tvLastMessage.getTypeface(), dialogStyle.getDialogUnreadMessageTextStyle()); + tvLastMessage.setTypeface(Typeface.DEFAULT, dialogStyle.getDialogUnreadMessageTextStyle()); } } } @@ -527,50 +643,61 @@ public void onBind(final DIALOG dialog) { //Set Date String formattedDate = null; - Date lastMessageDate = dialog.getLastMessage().getCreatedAt(); - if (datesFormatter != null) formattedDate = datesFormatter.format(lastMessageDate); - tvDate.setText(formattedDate == null - ? getDateString(lastMessageDate) - : formattedDate); + + if (dialog.getLastMessage() != null) { + Date lastMessageDate = dialog.getLastMessage().getCreatedAt(); + if (datesFormatter != null) formattedDate = datesFormatter.format(lastMessageDate); + tvDate.setText(formattedDate == null + ? getDateString(lastMessageDate) + : formattedDate); + } else { + tvDate.setText(null); + } //Set Dialog avatar if (imageLoader != null) { - imageLoader.loadImage(ivAvatar, dialog.getDialogPhoto()); + imageLoader.loadImage(ivAvatar, dialog.getDialogPhoto(), null); } - //Set Last message user avatar - if (imageLoader != null) { - imageLoader.loadImage(ivLastMessageUser, dialog.getLastMessage().getUser().getAvatar()); + //Set Last message user avatar with check if there is last message + if (imageLoader != null && dialog.getLastMessage() != null) { + imageLoader.loadImage(ivLastMessageUser, dialog.getLastMessage().getUser().getAvatar(), null); } ivLastMessageUser.setVisibility(dialogStyle.isDialogMessageAvatarEnabled() - && dialog.getUsers().size() > 1 ? VISIBLE : GONE); + && dialog.getUsers().size() > 1 + && dialog.getLastMessage() != null ? VISIBLE : GONE); //Set Last message text - tvLastMessage.setText(dialog.getLastMessage().getText()); + if (dialog.getLastMessage() != null) { + tvLastMessage.setText(dialog.getLastMessage().getText()); + } else { + tvLastMessage.setText(null); + } //Set Unread message count bubble tvBubble.setText(String.valueOf(dialog.getUnreadCount())); tvBubble.setVisibility(dialogStyle.isDialogUnreadBubbleEnabled() && dialog.getUnreadCount() > 0 ? VISIBLE : GONE); - if (onDialogClickListener != null) { - container.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - onDialogClickListener.onDialogClick(dialog); - } - }); - } + container.setOnClickListener(view -> { + if (onDialogClickListener != null) { + onDialogClickListener.onDialogClick(dialog); + } + if (onDialogViewClickListener != null) { + onDialogViewClickListener.onDialogViewClick(view, dialog); + } + }); - if (onLongItemClickListener != null) { - container.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - onLongItemClickListener.onDialogLongClick(dialog); - return true; - } - }); - } + + container.setOnLongClickListener(view -> { + if (onLongItemClickListener != null) { + onLongItemClickListener.onDialogLongClick(dialog); + } + if (onDialogViewLongClickListener != null) { + onDialogViewLongClickListener.onDialogViewLongClick(view, dialog); + } + return onLongItemClickListener != null || onDialogViewLongClickListener != null; + }); } protected String getDateString(Date date) { diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java index 9c52143a..2c09b016 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageHolders.java @@ -1,9 +1,8 @@ package com.stfalcon.chatkit.messages; -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; import android.text.Spannable; import android.text.method.LinkMovementMethod; +import android.util.SparseArray; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -12,6 +11,10 @@ import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; + import com.stfalcon.chatkit.R; import com.stfalcon.chatkit.commons.ImageLoader; import com.stfalcon.chatkit.commons.ViewHolder; @@ -28,6 +31,7 @@ /* * Created by troy379 on 31.03.17. */ +@SuppressWarnings("WeakerAccess") public class MessageHolders { private static final short VIEW_TYPE_DATE_HEADER = 130; @@ -70,6 +74,24 @@ public MessageHolders setIncomingTextConfig( return this; } + /** + * Sets both of custom view holder class and layout resource for incoming text message. + * + * @param holder holder class. + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingTextConfig( + @NonNull Class> holder, + @LayoutRes int layout, + Object payload) { + this.incomingTextConfig.holder = holder; + this.incomingTextConfig.layout = layout; + this.incomingTextConfig.payload = payload; + return this; + } + /** * Sets custom view holder class for incoming text message. * @@ -82,6 +104,21 @@ public MessageHolders setIncomingTextHolder( return this; } + /** + * Sets custom view holder class for incoming text message. + * + * @param holder holder class. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingTextHolder( + @NonNull Class> holder, + Object payload) { + this.incomingTextConfig.holder = holder; + this.incomingTextConfig.payload = payload; + return this; + } + /** * Sets custom layout resource for incoming text message. * @@ -93,6 +130,19 @@ public MessageHolders setIncomingTextLayout(@LayoutRes int layout) { return this; } + /** + * Sets custom layout resource for incoming text message. + * + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingTextLayout(@LayoutRes int layout, Object payload) { + this.incomingTextConfig.layout = layout; + this.incomingTextConfig.payload = payload; + return this; + } + /** * Sets both of custom view holder class and layout resource for outcoming text message. * @@ -108,6 +158,24 @@ public MessageHolders setOutcomingTextConfig( return this; } + /** + * Sets both of custom view holder class and layout resource for outcoming text message. + * + * @param holder holder class. + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingTextConfig( + @NonNull Class> holder, + @LayoutRes int layout, + Object payload) { + this.outcomingTextConfig.holder = holder; + this.outcomingTextConfig.layout = layout; + this.outcomingTextConfig.payload = payload; + return this; + } + /** * Sets custom view holder class for outcoming text message. * @@ -120,6 +188,21 @@ public MessageHolders setOutcomingTextHolder( return this; } + /** + * Sets custom view holder class for outcoming text message. + * + * @param holder holder class. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingTextHolder( + @NonNull Class> holder, + Object payload) { + this.outcomingTextConfig.holder = holder; + this.outcomingTextConfig.payload = payload; + return this; + } + /** * Sets custom layout resource for outcoming text message. * @@ -131,6 +214,19 @@ public MessageHolders setOutcomingTextLayout(@LayoutRes int layout) { return this; } + /** + * Sets custom layout resource for outcoming text message. + * + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingTextLayout(@LayoutRes int layout, Object payload) { + this.outcomingTextConfig.layout = layout; + this.outcomingTextConfig.payload = payload; + return this; + } + /** * Sets both of custom view holder class and layout resource for incoming image message. * @@ -146,6 +242,24 @@ public MessageHolders setIncomingImageConfig( return this; } + /** + * Sets both of custom view holder class and layout resource for incoming image message. + * + * @param holder holder class. + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingImageConfig( + @NonNull Class> holder, + @LayoutRes int layout, + Object payload) { + this.incomingImageConfig.holder = holder; + this.incomingImageConfig.layout = layout; + this.incomingImageConfig.payload = payload; + return this; + } + /** * Sets custom view holder class for incoming image message. * @@ -158,6 +272,21 @@ public MessageHolders setIncomingImageHolder( return this; } + /** + * Sets custom view holder class for incoming image message. + * + * @param holder holder class. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingImageHolder( + @NonNull Class> holder, + Object payload) { + this.incomingImageConfig.holder = holder; + this.incomingImageConfig.payload = payload; + return this; + } + /** * Sets custom layout resource for incoming image message. * @@ -169,6 +298,19 @@ public MessageHolders setIncomingImageLayout(@LayoutRes int layout) { return this; } + /** + * Sets custom layout resource for incoming image message. + * + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setIncomingImageLayout(@LayoutRes int layout, Object payload) { + this.incomingImageConfig.layout = layout; + this.incomingImageConfig.payload = payload; + return this; + } + /** * Sets both of custom view holder class and layout resource for outcoming image message. * @@ -184,6 +326,24 @@ public MessageHolders setOutcomingImageConfig( return this; } + /** + * Sets both of custom view holder class and layout resource for outcoming image message. + * + * @param holder holder class. + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingImageConfig( + @NonNull Class> holder, + @LayoutRes int layout, + Object payload) { + this.outcomingImageConfig.holder = holder; + this.outcomingImageConfig.layout = layout; + this.outcomingImageConfig.payload = payload; + return this; + } + /** * Sets custom view holder class for outcoming image message. * @@ -196,6 +356,21 @@ public MessageHolders setOutcomingImageHolder( return this; } + /** + * Sets custom view holder class for outcoming image message. + * + * @param holder holder class. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingImageHolder( + @NonNull Class> holder, + Object payload) { + this.outcomingImageConfig.holder = holder; + this.outcomingImageConfig.payload = payload; + return this; + } + /** * Sets custom layout resource for outcoming image message. * @@ -207,6 +382,19 @@ public MessageHolders setOutcomingImageLayout(@LayoutRes int layout) { return this; } + /** + * Sets custom layout resource for outcoming image message. + * + * @param layout layout resource. + * @param payload custom data. + * @return {@link MessageHolders} for subsequent configuration. + */ + public MessageHolders setOutcomingImageLayout(@LayoutRes int layout, Object payload) { + this.outcomingImageConfig.layout = layout; + this.outcomingImageConfig.payload = payload; + return this; + } + /** * Sets both of custom view holder class and layout resource for date header. * @@ -296,9 +484,40 @@ MessageHolders registerContentType( return this; } + /** + * Registers custom content type (e.g. multimedia, events etc.) + * + * @param type unique id for content type + * @param incomingHolder holder class for incoming message + * @param outcomingHolder holder class for outcoming message + * @param incomingPayload payload for incoming message + * @param outcomingPayload payload for outcoming message + * @param incomingLayout layout resource for incoming message + * @param outcomingLayout layout resource for outcoming message + * @param contentChecker {@link MessageHolders.ContentChecker} for registered type + * @return {@link MessageHolders} for subsequent configuration. + */ + public + MessageHolders registerContentType( + byte type, + @NonNull Class> incomingHolder, Object incomingPayload, @LayoutRes int incomingLayout, + @NonNull Class> outcomingHolder, Object outcomingPayload, @LayoutRes int outcomingLayout, + @NonNull MessageHolders.ContentChecker contentChecker) { + + if (type == 0) + throw new IllegalArgumentException("content type must be greater or less than '0'!"); + + customContentTypes.add( + new MessageHolders.ContentTypeConfig<>(type, + new HolderConfig<>(incomingHolder, incomingLayout, incomingPayload), + new HolderConfig<>(outcomingHolder, outcomingLayout, outcomingPayload))); + this.contentChecker = contentChecker; + return this; + } + /* - * INTERFACES - * */ + * INTERFACES + * */ /** * The interface, which contains logic for checking the availability of content. @@ -316,13 +535,13 @@ public interface ContentChecker { } /* - * PRIVATE METHODS - * */ + * PRIVATE METHODS + * */ - ViewHolder getHolder(ViewGroup parent, int viewType, MessagesListStyle messagesListStyle) { + protected ViewHolder getHolder(ViewGroup parent, int viewType, MessagesListStyle messagesListStyle) { switch (viewType) { case VIEW_TYPE_DATE_HEADER: - return getHolder(parent, dateHeaderLayout, dateHeaderHolder, messagesListStyle); + return getHolder(parent, dateHeaderLayout, dateHeaderHolder, messagesListStyle, null); case VIEW_TYPE_TEXT_MESSAGE: return getHolder(parent, incomingTextConfig, messagesListStyle); case -VIEW_TYPE_TEXT_MESSAGE: @@ -341,20 +560,30 @@ ViewHolder getHolder(ViewGroup parent, int viewType, MessagesListStyle messagesL } } } - return null; + throw new IllegalStateException("Wrong message view type. Please, report this issue on GitHub with full stacktrace in description."); } @SuppressWarnings("unchecked") - void bind(ViewHolder holder, Object item, boolean isSelected, ImageLoader imageLoader, - View.OnClickListener onMessageClickListener, - View.OnLongClickListener onMessageLongClickListener, - DateFormatter.Formatter dateHeadersFormatter) { + protected void bind(final ViewHolder holder, final Object item, boolean isSelected, + final ImageLoader imageLoader, + final View.OnClickListener onMessageClickListener, + final View.OnLongClickListener onMessageLongClickListener, + final DateFormatter.Formatter dateHeadersFormatter, + final SparseArray clickListenersArray) { if (item instanceof IMessage) { ((MessageHolders.BaseMessageViewHolder) holder).isSelected = isSelected; ((MessageHolders.BaseMessageViewHolder) holder).imageLoader = imageLoader; holder.itemView.setOnLongClickListener(onMessageLongClickListener); holder.itemView.setOnClickListener(onMessageClickListener); + + for (int i = 0; i < clickListenersArray.size(); i++) { + final int key = clickListenersArray.keyAt(i); + final View view = holder.itemView.findViewById(key); + if (view != null) { + view.setOnClickListener(v -> clickListenersArray.get(key).onMessageViewClick(view, (IMessage) item)); + } + } } else if (item instanceof Date) { ((MessageHolders.DefaultDateHeaderViewHolder) holder).dateHeadersFormatter = dateHeadersFormatter; } @@ -363,7 +592,7 @@ void bind(ViewHolder holder, Object item, boolean isSelected, ImageLoader imageL } - int getViewType(Object item, String senderId) { + protected int getViewType(Object item, String senderId) { boolean isOutcoming = false; int viewType; @@ -377,24 +606,34 @@ int getViewType(Object item, String senderId) { return isOutcoming ? viewType * -1 : viewType; } - private ViewHolder getHolder(ViewGroup parent, HolderConfig holderConfig, MessagesListStyle style) { - return getHolder(parent, holderConfig.layout, holderConfig.holder, style); + private ViewHolder getHolder(ViewGroup parent, HolderConfig holderConfig, + MessagesListStyle style) { + return getHolder(parent, holderConfig.layout, holderConfig.holder, style, holderConfig.payload); } private - ViewHolder getHolder(ViewGroup parent, @LayoutRes int layout, Class holderClass, MessagesListStyle style) { + ViewHolder getHolder(ViewGroup parent, @LayoutRes int layout, Class holderClass, + MessagesListStyle style, Object payload) { View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false); try { - Constructor constructor = holderClass.getDeclaredConstructor(View.class); - constructor.setAccessible(true); - HOLDER holder = constructor.newInstance(v); + Constructor constructor = null; + HOLDER holder; + try { + constructor = holderClass.getDeclaredConstructor(View.class, Object.class); + constructor.setAccessible(true); + holder = constructor.newInstance(v, payload); + } catch (NoSuchMethodException e) { + constructor = holderClass.getDeclaredConstructor(View.class); + constructor.setAccessible(true); + holder = constructor.newInstance(v); + } if (holder instanceof DefaultMessageViewHolder && style != null) { ((DefaultMessageViewHolder) holder).applyStyle(style); } return holder; } catch (Exception e) { - return null; + throw new UnsupportedOperationException("Somehow we couldn't create the ViewHolder for message. Please, report this issue on GitHub with full stacktrace in description.", e); } } @@ -422,8 +661,8 @@ private short getContentViewType(IMessage message) { } /* - * HOLDERS - * */ + * HOLDERS + * */ /** * The base class for view holders for incoming and outcoming message. @@ -433,15 +672,26 @@ public static abstract class BaseMessageViewHolder ext boolean isSelected; + /** + * For setting custom data to ViewHolder + */ + protected Object payload; + /** * Callback for implementing images loading in message list */ - ImageLoader imageLoader; + protected ImageLoader imageLoader; + @Deprecated public BaseMessageViewHolder(View itemView) { super(itemView); } + public BaseMessageViewHolder(View itemView, Object payload) { + super(itemView); + this.payload = payload; + } + /** * Returns whether is item selected * @@ -483,7 +733,6 @@ public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event } }); } - } /** @@ -495,10 +744,15 @@ public static class IncomingTextMessageViewHolder protected ViewGroup bubble; protected TextView text; + @Deprecated public IncomingTextMessageViewHolder(View itemView) { super(itemView); - bubble = (ViewGroup) itemView.findViewById(R.id.bubble); - text = (TextView) itemView.findViewById(R.id.messageText); + init(itemView); + } + + public IncomingTextMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); + init(itemView); } @Override @@ -521,7 +775,7 @@ public void applyStyle(MessagesListStyle style) { style.getIncomingDefaultBubblePaddingTop(), style.getIncomingDefaultBubblePaddingRight(), style.getIncomingDefaultBubblePaddingBottom()); - bubble.setBackground(style.getIncomingBubbleDrawable()); + ViewCompat.setBackground(bubble, style.getIncomingBubbleDrawable()); } if (text != null) { @@ -533,6 +787,11 @@ public void applyStyle(MessagesListStyle style) { configureLinksBehavior(text); } } + + private void init(View itemView) { + bubble = itemView.findViewById(R.id.bubble); + text = itemView.findViewById(R.id.messageText); + } } /** @@ -544,10 +803,15 @@ public static class OutcomingTextMessageViewHolder protected ViewGroup bubble; protected TextView text; + @Deprecated public OutcomingTextMessageViewHolder(View itemView) { super(itemView); - bubble = (ViewGroup) itemView.findViewById(R.id.bubble); - text = (TextView) itemView.findViewById(R.id.messageText); + init(itemView); + } + + public OutcomingTextMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); + init(itemView); } @Override @@ -570,7 +834,7 @@ public final void applyStyle(MessagesListStyle style) { style.getOutcomingDefaultBubblePaddingTop(), style.getOutcomingDefaultBubblePaddingRight(), style.getOutcomingDefaultBubblePaddingBottom()); - bubble.setBackground(style.getOutcomingBubbleDrawable()); + ViewCompat.setBackground(bubble, style.getOutcomingBubbleDrawable()); } if (text != null) { @@ -582,6 +846,11 @@ public final void applyStyle(MessagesListStyle style) { configureLinksBehavior(text); } } + + private void init(View itemView) { + bubble = itemView.findViewById(R.id.bubble); + text = itemView.findViewById(R.id.messageText); + } } /** @@ -593,26 +862,22 @@ public static class IncomingImageMessageViewHolder public DefaultDateHeaderViewHolder(View itemView) { super(itemView); - text = (TextView) itemView.findViewById(R.id.messageText); + text = itemView.findViewById(R.id.messageText); } @Override @@ -733,10 +1040,15 @@ public abstract static class BaseIncomingMessageViewHolder { public DefaultIncomingTextMessageViewHolder(View itemView) { - super(itemView); + super(itemView, null); } } @@ -823,7 +1150,7 @@ private static class DefaultOutcomingTextMessageViewHolder extends OutcomingTextMessageViewHolder { public DefaultOutcomingTextMessageViewHolder(View itemView) { - super(itemView); + super(itemView, null); } } @@ -831,7 +1158,7 @@ private static class DefaultIncomingImageMessageViewHolder extends IncomingImageMessageViewHolder { public DefaultIncomingImageMessageViewHolder(View itemView) { - super(itemView); + super(itemView, null); } } @@ -839,7 +1166,7 @@ private static class DefaultOutcomingImageMessageViewHolder extends OutcomingImageMessageViewHolder { public DefaultOutcomingImageMessageViewHolder(View itemView) { - super(itemView); + super(itemView, null); } } @@ -858,14 +1185,21 @@ private ContentTypeConfig( } } - private class HolderConfig { + private static class HolderConfig { - Class> holder; - int layout; + protected Class> holder; + protected int layout; + protected Object payload; HolderConfig(Class> holder, int layout) { this.holder = holder; this.layout = layout; } + + HolderConfig(Class> holder, int layout, Object payload) { + this.holder = holder; + this.layout = layout; + this.payload = payload; + } } } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInput.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInput.java index 1d7d58b4..665f0503 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInput.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInput.java @@ -18,7 +18,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; -import android.support.v4.widget.Space; +import android.os.Build; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; @@ -27,8 +27,11 @@ import android.widget.EditText; import android.widget.ImageButton; import android.widget.RelativeLayout; +import android.widget.Space; import android.widget.TextView; +import androidx.core.view.ViewCompat; + import com.stfalcon.chatkit.R; import java.lang.reflect.Field; @@ -36,8 +39,9 @@ /** * Component for input outcoming messages */ +@SuppressWarnings({"WeakerAccess", "unused"}) public class MessageInput extends RelativeLayout - implements View.OnClickListener, TextWatcher { + implements View.OnClickListener, TextWatcher, View.OnFocusChangeListener { protected EditText messageInput; protected ImageButton messageSendButton; @@ -47,6 +51,19 @@ public class MessageInput extends RelativeLayout private CharSequence input; private InputListener inputListener; private AttachmentsListener attachmentsListener; + private boolean isTyping; + private TypingListener typingListener; + private int delayTypingStatusMillis; + private Runnable typingTimerRunnable = new Runnable() { + @Override + public void run() { + if (isTyping) { + isTyping = false; + if (typingListener != null) typingListener.onStopTyping(); + } + } + }; + private boolean lastFocus; public MessageInput(Context context) { super(context); @@ -107,6 +124,8 @@ public void onClick(View view) { if (isSubmitted) { messageInput.setText(""); } + removeCallbacks(typingTimerRunnable); + post(typingTimerRunnable); } else if (id == R.id.attachmentButton) { onAddAttachments(); } @@ -120,6 +139,14 @@ public void onClick(View view) { public void onTextChanged(CharSequence s, int start, int count, int after) { input = s; messageSendButton.setEnabled(input.length() > 0); + if (s.length() > 0) { + if (!isTyping) { + isTyping = true; + if (typingListener != null) typingListener.onStartTyping(); + } + removeCallbacks(typingTimerRunnable); + postDelayed(typingTimerRunnable, delayTypingStatusMillis); + } } /** @@ -128,7 +155,7 @@ public void onTextChanged(CharSequence s, int start, int count, int after) { */ @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { - + //do nothing } /** @@ -136,7 +163,15 @@ public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) */ @Override public void afterTextChanged(Editable editable) { + //do nothing + } + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (lastFocus && !hasFocus && typingListener != null) { + typingListener.onStopTyping(); + } + lastFocus = hasFocus; } private boolean onSubmit() { @@ -157,22 +192,22 @@ private void init(Context context, AttributeSet attrs) { this.messageInput.setTextSize(TypedValue.COMPLEX_UNIT_PX, style.getInputTextSize()); this.messageInput.setTextColor(style.getInputTextColor()); this.messageInput.setHintTextColor(style.getInputHintColor()); - this.messageInput.setBackground(style.getInputBackground()); + ViewCompat.setBackground(this.messageInput, style.getInputBackground()); setCursor(style.getInputCursorDrawable()); this.attachmentButton.setVisibility(style.showAttachmentButton() ? VISIBLE : GONE); - this.attachmentButton.setBackground(style.getAttachmentButtonBackground()); this.attachmentButton.setImageDrawable(style.getAttachmentButtonIcon()); this.attachmentButton.getLayoutParams().width = style.getAttachmentButtonWidth(); this.attachmentButton.getLayoutParams().height = style.getAttachmentButtonHeight(); + ViewCompat.setBackground(this.attachmentButton, style.getAttachmentButtonBackground()); this.attachmentButtonSpace.setVisibility(style.showAttachmentButton() ? VISIBLE : GONE); this.attachmentButtonSpace.getLayoutParams().width = style.getAttachmentButtonMargin(); - this.messageSendButton.setBackground(style.getInputButtonBackground()); this.messageSendButton.setImageDrawable(style.getInputButtonIcon()); this.messageSendButton.getLayoutParams().width = style.getInputButtonWidth(); this.messageSendButton.getLayoutParams().height = style.getInputButtonHeight(); + ViewCompat.setBackground(messageSendButton, style.getInputButtonBackground()); this.sendButtonSpace.getLayoutParams().width = style.getInputButtonMargin(); if (getPaddingLeft() == 0 @@ -186,32 +221,54 @@ && getPaddingBottom() == 0) { style.getInputDefaultPaddingBottom() ); } + this.delayTypingStatusMillis = style.getDelayTypingStatus(); } private void init(Context context) { inflate(context, R.layout.view_message_input, this); - messageInput = (EditText) findViewById(R.id.messageInput); - messageSendButton = (ImageButton) findViewById(R.id.messageSendButton); - attachmentButton = (ImageButton) findViewById(R.id.attachmentButton); - sendButtonSpace = (Space) findViewById(R.id.sendButtonSpace); - attachmentButtonSpace = (Space) findViewById(R.id.attachmentButtonSpace); + messageInput = findViewById(R.id.messageInput); + messageSendButton = findViewById(R.id.messageSendButton); + attachmentButton = findViewById(R.id.attachmentButton); + sendButtonSpace = findViewById(R.id.sendButtonSpace); + attachmentButtonSpace = findViewById(R.id.attachmentButtonSpace); messageSendButton.setOnClickListener(this); attachmentButton.setOnClickListener(this); messageInput.addTextChangedListener(this); messageInput.setText(""); + messageInput.setOnFocusChangeListener(this); } private void setCursor(Drawable drawable) { + if (drawable == null) return; + try { - Field f = TextView.class.getDeclaredField("mCursorDrawableRes"); - f.setAccessible(true); - f.set(this.messageInput, drawable); - } catch (Exception ignore) { + final Field drawableResField = TextView.class.getDeclaredField("mCursorDrawableRes"); + drawableResField.setAccessible(true); + + final Object drawableFieldOwner; + final Class drawableFieldClass; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { + drawableFieldOwner = this.messageInput; + drawableFieldClass = TextView.class; + } else { + final Field editorField = TextView.class.getDeclaredField("mEditor"); + editorField.setAccessible(true); + drawableFieldOwner = editorField.get(this.messageInput); + drawableFieldClass = drawableFieldOwner.getClass(); + } + final Field drawableField = drawableFieldClass.getDeclaredField("mCursorDrawable"); + drawableField.setAccessible(true); + drawableField.set(drawableFieldOwner, new Drawable[]{drawable, drawable}); + } catch (Exception ignored) { } } + public void setTypingListener(TypingListener typingListener) { + this.typingListener = typingListener; + } + /** * Interface definition for a callback to be invoked when user pressed 'submit' button */ @@ -236,4 +293,21 @@ public interface AttachmentsListener { */ void onAddAttachments(); } + + /** + * Interface definition for a callback to be invoked when user typing + */ + public interface TypingListener { + + /** + * Fires when user presses start typing + */ + void onStartTyping(); + + /** + * Fires when user presses stop typing + */ + void onStopTyping(); + + } } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInputStyle.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInputStyle.java index 0c6d3248..ddac1859 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInputStyle.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessageInputStyle.java @@ -20,20 +20,23 @@ import android.content.res.ColorStateList; import android.content.res.TypedArray; import android.graphics.drawable.Drawable; -import android.support.annotation.ColorInt; -import android.support.annotation.DrawableRes; -import android.support.v4.graphics.drawable.DrawableCompat; import android.util.AttributeSet; +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.core.graphics.drawable.DrawableCompat; + import com.stfalcon.chatkit.R; import com.stfalcon.chatkit.commons.Style; /** * Style for MessageInputStyle customization by xml attributes */ +@SuppressWarnings("WeakerAccess") class MessageInputStyle extends Style { private static final int DEFAULT_MAX_LINES = 5; + private static final int DEFAULT_DELAY_TYPING_STATUS = 1500; private boolean showAttachmentButton; @@ -81,6 +84,8 @@ class MessageInputStyle extends Style { private int inputDefaultPaddingTop; private int inputDefaultPaddingBottom; + private int delayTypingStatus; + static MessageInputStyle parse(Context context, AttributeSet attrs) { MessageInputStyle style = new MessageInputStyle(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MessageInput); @@ -138,6 +143,8 @@ static MessageInputStyle parse(Context context, AttributeSet attrs) { style.inputBackground = typedArray.getDrawable(R.styleable.MessageInput_inputBackground); style.inputCursorDrawable = typedArray.getDrawable(R.styleable.MessageInput_inputCursorDrawable); + style.delayTypingStatus = typedArray.getInt(R.styleable.MessageInput_delayTypingStatus, DEFAULT_DELAY_TYPING_STATUS); + typedArray.recycle(); style.inputDefaultPaddingLeft = style.getDimension(R.dimen.input_padding_left); @@ -169,11 +176,11 @@ private Drawable getSelector(@ColorInt int normalColor, @ColorInt int pressedCol return drawable; } - boolean showAttachmentButton() { + protected boolean showAttachmentButton() { return showAttachmentButton; } - Drawable getAttachmentButtonBackground() { + protected Drawable getAttachmentButtonBackground() { if (attachmentButtonBackground == -1) { return getSelector(attachmentButtonDefaultBgColor, attachmentButtonDefaultBgPressedColor, attachmentButtonDefaultBgDisabledColor, R.drawable.mask); @@ -182,7 +189,7 @@ Drawable getAttachmentButtonBackground() { } } - Drawable getAttachmentButtonIcon() { + protected Drawable getAttachmentButtonIcon() { if (attachmentButtonIcon == -1) { return getSelector(attachmentButtonDefaultIconColor, attachmentButtonDefaultIconPressedColor, attachmentButtonDefaultIconDisabledColor, R.drawable.ic_add_attachment); @@ -191,19 +198,19 @@ Drawable getAttachmentButtonIcon() { } } - int getAttachmentButtonWidth() { + protected int getAttachmentButtonWidth() { return attachmentButtonWidth; } - int getAttachmentButtonHeight() { + protected int getAttachmentButtonHeight() { return attachmentButtonHeight; } - int getAttachmentButtonMargin() { + protected int getAttachmentButtonMargin() { return attachmentButtonMargin; } - Drawable getInputButtonBackground() { + protected Drawable getInputButtonBackground() { if (inputButtonBackground == -1) { return getSelector(inputButtonDefaultBgColor, inputButtonDefaultBgPressedColor, inputButtonDefaultBgDisabledColor, R.drawable.mask); @@ -212,7 +219,7 @@ Drawable getInputButtonBackground() { } } - Drawable getInputButtonIcon() { + protected Drawable getInputButtonIcon() { if (inputButtonIcon == -1) { return getSelector(inputButtonDefaultIconColor, inputButtonDefaultIconPressedColor, inputButtonDefaultIconDisabledColor, R.drawable.ic_send); @@ -221,64 +228,68 @@ Drawable getInputButtonIcon() { } } - int getInputButtonMargin() { + protected int getInputButtonMargin() { return inputButtonMargin; } - int getInputButtonWidth() { + protected int getInputButtonWidth() { return inputButtonWidth; } - int getInputButtonHeight() { + protected int getInputButtonHeight() { return inputButtonHeight; } - int getInputMaxLines() { + protected int getInputMaxLines() { return inputMaxLines; } - String getInputHint() { + protected String getInputHint() { return inputHint; } - String getInputText() { + protected String getInputText() { return inputText; } - int getInputTextSize() { + protected int getInputTextSize() { return inputTextSize; } - int getInputTextColor() { + protected int getInputTextColor() { return inputTextColor; } - int getInputHintColor() { + protected int getInputHintColor() { return inputHintColor; } - Drawable getInputBackground() { + protected Drawable getInputBackground() { return inputBackground; } - Drawable getInputCursorDrawable() { + protected Drawable getInputCursorDrawable() { return inputCursorDrawable; } - int getInputDefaultPaddingLeft() { + protected int getInputDefaultPaddingLeft() { return inputDefaultPaddingLeft; } - int getInputDefaultPaddingRight() { + protected int getInputDefaultPaddingRight() { return inputDefaultPaddingRight; } - int getInputDefaultPaddingTop() { + protected int getInputDefaultPaddingTop() { return inputDefaultPaddingTop; } - int getInputDefaultPaddingBottom() { + protected int getInputDefaultPaddingBottom() { return inputDefaultPaddingBottom; } + int getDelayTypingStatus() { + return delayTypingStatus; + } + } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesList.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesList.java index 654783e3..901b6eeb 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesList.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesList.java @@ -17,13 +17,14 @@ package com.stfalcon.chatkit.messages; import android.content.Context; -import android.support.annotation.Nullable; -import android.support.v7.widget.DefaultItemAnimator; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.SimpleItemAnimator; import android.util.AttributeSet; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.SimpleItemAnimator; + import com.stfalcon.chatkit.commons.models.IMessage; /** @@ -56,18 +57,30 @@ public void setAdapter(Adapter adapter) { } /** - * Set adapter for MessagesList + * Sets adapter for MessagesList * * @param adapter Adapter. Must extend MessagesListAdapter * @param Message model class */ public void setAdapter(MessagesListAdapter adapter) { + setAdapter(adapter, true); + } + + /** + * Sets adapter for MessagesList + * + * @param adapter Adapter. Must extend MessagesListAdapter + * @param reverseLayout weather to use reverse layout for layout manager. + * @param Message model class + */ + public + void setAdapter(MessagesListAdapter adapter, boolean reverseLayout) { SimpleItemAnimator itemAnimator = new DefaultItemAnimator(); itemAnimator.setSupportsChangeAnimations(false); LinearLayoutManager layoutManager = new LinearLayoutManager(getContext(), - LinearLayoutManager.VERTICAL, true); + LinearLayoutManager.VERTICAL, reverseLayout); setItemAnimator(itemAnimator); setLayoutManager(layoutManager); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java index 7d690948..74ed2760 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListAdapter.java @@ -19,16 +19,18 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.v7.widget.RecyclerView; import android.text.Spannable; import android.text.method.LinkMovementMethod; +import android.util.SparseArray; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import androidx.annotation.LayoutRes; +import androidx.recyclerview.widget.RecyclerView; + import com.stfalcon.chatkit.R; import com.stfalcon.chatkit.commons.ImageLoader; import com.stfalcon.chatkit.commons.ViewHolder; @@ -43,26 +45,30 @@ /** * Adapter for {@link MessagesList}. */ +@SuppressWarnings("WeakerAccess") public class MessagesListAdapter extends RecyclerView.Adapter implements RecyclerScrollMoreListener.OnLoadMoreListener { + protected static boolean isSelectionModeEnabled; + + protected List items; private MessageHolders holders; private String senderId; - private List items; private int selectedItemsCount; private SelectionListener selectionListener; - static boolean isSelectionModeEnabled; - private OnLoadMoreListener loadMoreListener; private OnMessageClickListener onMessageClickListener; + private OnMessageViewClickListener onMessageViewClickListener; private OnMessageLongClickListener onMessageLongClickListener; + private OnMessageViewLongClickListener onMessageViewLongClickListener; private ImageLoader imageLoader; private RecyclerView.LayoutManager layoutManager; private MessagesListStyle messagesListStyle; private DateFormatter.Formatter dateHeadersFormatter; + private SparseArray viewClickListenersArray = new SparseArray<>(); /** * For default list item layout and view holder. @@ -77,9 +83,9 @@ public MessagesListAdapter(String senderId, ImageLoader imageLoader) { /** * For default list item layout and view holder. * - * @param senderId identifier of sender. - * @param holders custom layouts and view holders. See {@link MessageHolders} documentation for details - * @param imageLoader image loading method. + * @param senderId identifier of sender. + * @param holders custom layouts and view holders. See {@link MessageHolders} documentation for details + * @param imageLoader image loading method. */ public MessagesListAdapter(String senderId, MessageHolders holders, ImageLoader imageLoader) { @@ -101,7 +107,8 @@ public void onBindViewHolder(ViewHolder holder, int position) { holders.bind(holder, wrapper.item, wrapper.isSelected, imageLoader, getMessageClickListener(wrapper), getMessageLongClickListener(wrapper), - dateHeadersFormatter); + dateHeadersFormatter, + viewClickListenersArray); } @Override @@ -121,9 +128,20 @@ public void onLoadMore(int page, int total) { } } + @Override + public int getMessagesCount() { + int count = 0; + for (Wrapper item : items) { + if (item.item instanceof IMessage) { + count++; + } + } + return count; + } + /* - * PUBLIC METHODS - * */ + * PUBLIC METHODS + * */ /** * Adds message to bottom of list and scroll if needed. @@ -151,6 +169,8 @@ public void addToStart(MESSAGE message, boolean scroll) { * @param reverse {@code true} if need to reverse messages before adding. */ public void addToEnd(List messages, boolean reverse) { + if (messages.isEmpty()) return; + if (reverse) Collections.reverse(messages); if (!items.isEmpty()) { @@ -172,8 +192,8 @@ public void addToEnd(List messages, boolean reverse) { * * @param message updated message object. */ - public void update(MESSAGE message) { - update(message.getId(), message); + public boolean update(MESSAGE message) { + return update(message.getId(), message); } /** @@ -182,12 +202,60 @@ public void update(MESSAGE message) { * @param oldId an identifier of message to update. * @param newMessage new message object. */ - public void update(String oldId, MESSAGE newMessage) { + public boolean update(String oldId, MESSAGE newMessage) { int position = getMessagePositionById(oldId); if (position >= 0) { Wrapper element = new Wrapper<>(newMessage); items.set(position, element); notifyItemChanged(position); + return true; + } else { + return false; + } + } + + /** + * Moves the elements position from current to start + * + * @param newMessage new message object. + */ + public void updateAndMoveToStart(MESSAGE newMessage) { + int position = getMessagePositionById(newMessage.getId()); + if (position >= 0) { + Wrapper element = new Wrapper<>(newMessage); + items.remove(position); + items.add(0, element); + notifyItemMoved(position, 0); + notifyItemChanged(0); + } + } + + /** + * Updates message by its id if it exists, add to start if not + * + * @param message message object to insert or update. + */ + public void upsert(MESSAGE message) { + if (!update(message)) { + addToStart(message, false); + } + } + + /** + * Updates and moves to start if message by its id exists and if specified move to start, if not + * specified the item stays at current position and updated + * + * @param message message object to insert or update. + */ + public void upsert(MESSAGE message, boolean moveToStartIfUpdate) { + if (moveToStartIfUpdate) { + if (getMessagePositionById(message.getId()) > 0) { + updateAndMoveToStart(message); + } else { + upsert(message); + } + } else { + upsert(message); } } @@ -206,12 +274,18 @@ public void delete(MESSAGE message) { * @param messages messages list to delete. */ public void delete(List messages) { + boolean result = false; for (MESSAGE message : messages) { int index = getMessagePositionById(message.getId()); - items.remove(index); - notifyItemRemoved(index); + if (index >= 0) { + items.remove(index); + notifyItemRemoved(index); + result = true; + } + } + if (result) { + recountDateHeaders(); } - recountDateHeaders(); } /** @@ -234,12 +308,18 @@ public void deleteById(String id) { * @param ids array of identifiers of messages to delete. */ public void deleteByIds(String[] ids) { + boolean result = false; for (String id : ids) { int index = getMessagePositionById(id); - items.remove(index); - notifyItemRemoved(index); + if (index >= 0) { + items.remove(index); + notifyItemRemoved(index); + result = true; + } + } + if (result) { + recountDateHeaders(); } - recountDateHeaders(); } /** @@ -252,10 +332,22 @@ public boolean isEmpty() { } /** - * Clears the messages list. + * Clears the messages list. With notifyDataSetChanged */ public void clear() { - items.clear(); + clear(true); + } + + /** + * Clears the messages list. + */ + public void clear(boolean notifyDataSetChanged) { + if (items != null) { + items.clear(); + if (notifyDataSetChanged) { + notifyDataSetChanged(); + } + } } /** @@ -358,6 +450,25 @@ public void setOnMessageClickListener(OnMessageClickListener onMessageC this.onMessageClickListener = onMessageClickListener; } + /** + * Sets click listener for message view. Fires ONLY if list is not in selection mode. + * + * @param onMessageViewClickListener click listener. + */ + public void setOnMessageViewClickListener(OnMessageViewClickListener onMessageViewClickListener) { + this.onMessageViewClickListener = onMessageViewClickListener; + } + + /** + * Registers click listener for view by id + * + * @param viewId view + * @param onMessageViewClickListener click listener. + */ + public void registerViewClickListener(int viewId, OnMessageViewClickListener onMessageViewClickListener) { + this.viewClickListenersArray.append(viewId, onMessageViewClickListener); + } + /** * Sets long click listener for item. Fires only if selection mode is disabled. * @@ -367,6 +478,15 @@ public void setOnMessageLongClickListener(OnMessageLongClickListener on this.onMessageLongClickListener = onMessageLongClickListener; } + /** + * Sets long click listener for message view. Fires ONLY if selection mode is disabled. + * + * @param onMessageViewLongClickListener long click listener. + */ + public void setOnMessageViewLongClickListener(OnMessageViewLongClickListener onMessageViewLongClickListener) { + this.onMessageViewLongClickListener = onMessageViewLongClickListener; + } + /** * Set callback to be invoked when list scrolled to top. * @@ -384,8 +504,8 @@ public void setDateHeadersFormatter(DateFormatter.Formatter dateHeadersFormatter } /* - * PRIVATE METHODS - * */ + * PRIVATE METHODS + * */ private void recountDateHeaders() { List indicesToDelete = new ArrayList<>(); @@ -409,7 +529,7 @@ private void recountDateHeaders() { } } - private void generateDateHeaders(List messages) { + protected void generateDateHeaders(List messages) { for (int i = 0; i < messages.size(); i++) { MESSAGE message = messages.get(i); this.items.add(new Wrapper<>(message)); @@ -451,10 +571,8 @@ private boolean isPreviousSameDate(int position, Date dateToCompare) { private boolean isPreviousSameAuthor(String id, int position) { int prevPosition = position + 1; if (items.size() <= prevPosition) return false; - - if (items.get(prevPosition).item instanceof IMessage) { - return ((MESSAGE) items.get(prevPosition).item).getUser().getId().contentEquals(id); - } else return false; + else return items.get(prevPosition).item instanceof IMessage + && ((MESSAGE) items.get(prevPosition).item).getUser().getId().contentEquals(id); } private void incrementSelectedItemsCount() { @@ -481,44 +599,51 @@ private void notifyMessageClicked(MESSAGE message) { } } + private void notifyMessageViewClicked(View view, MESSAGE message) { + if (onMessageViewClickListener != null) { + onMessageViewClickListener.onMessageViewClick(view, message); + } + } + private void notifyMessageLongClicked(MESSAGE message) { if (onMessageLongClickListener != null) { onMessageLongClickListener.onMessageLongClick(message); } } + private void notifyMessageViewLongClicked(View view, MESSAGE message) { + if (onMessageViewLongClickListener != null) { + onMessageViewLongClickListener.onMessageViewLongClick(view, message); + } + } + private View.OnClickListener getMessageClickListener(final Wrapper wrapper) { - return new View.OnClickListener() { - @Override - public void onClick(View view) { - if (selectionListener != null && isSelectionModeEnabled) { - wrapper.isSelected = !wrapper.isSelected; + return view -> { + if (selectionListener != null && isSelectionModeEnabled) { + wrapper.isSelected = !wrapper.isSelected; - if (wrapper.isSelected) incrementSelectedItemsCount(); - else decrementSelectedItemsCount(); + if (wrapper.isSelected) incrementSelectedItemsCount(); + else decrementSelectedItemsCount(); - MESSAGE message = (wrapper.item); - notifyItemChanged(getMessagePositionById(message.getId())); - } else { - notifyMessageClicked(wrapper.item); - } + MESSAGE message = (wrapper.item); + notifyItemChanged(getMessagePositionById(message.getId())); + } else { + notifyMessageClicked(wrapper.item); + notifyMessageViewClicked(view, wrapper.item); } }; } private View.OnLongClickListener getMessageLongClickListener(final Wrapper wrapper) { - return new View.OnLongClickListener() { - @Override - public boolean onLongClick(View view) { - if (selectionListener == null) { - notifyMessageLongClicked(wrapper.item); - return true; - } else { - isSelectionModeEnabled = true; - view.callOnClick(); - return true; - } + return view -> { + if (selectionListener == null) { + notifyMessageLongClicked(wrapper.item); + notifyMessageViewLongClicked(view, wrapper.item); + } else { + isSelectionModeEnabled = true; + view.performClick(); } + return true; }; } @@ -554,11 +679,11 @@ void setStyle(MessagesListStyle style) { } /* - * WRAPPER - * */ - private class Wrapper { - DATA item; - boolean isSelected; + * WRAPPER + * */ + public static class Wrapper { + public DATA item; + public boolean isSelected; Wrapper(DATA item) { this.item = item; @@ -566,8 +691,8 @@ private class Wrapper { } /* - * LISTENERS - * */ + * LISTENERS + * */ /** * Interface definition for a callback to be invoked when next part of messages need to be loaded. @@ -602,26 +727,52 @@ public interface SelectionListener { public interface OnMessageClickListener { /** - * Fires when message was clicked. + * Fires when message is clicked. * * @param message clicked message. */ void onMessageClick(MESSAGE message); } + /** + * Interface definition for a callback to be invoked when message view is clicked. + */ + public interface OnMessageViewClickListener { + + /** + * Fires when message view is clicked. + * + * @param message clicked message. + */ + void onMessageViewClick(View view, MESSAGE message); + } + /** * Interface definition for a callback to be invoked when message item is long clicked. */ public interface OnMessageLongClickListener { /** - * Fires when message was long clicked. + * Fires when message is long clicked. * * @param message clicked message. */ void onMessageLongClick(MESSAGE message); } + /** + * Interface definition for a callback to be invoked when message view is long clicked. + */ + public interface OnMessageViewLongClickListener { + + /** + * Fires when message view is long clicked. + * + * @param message clicked message. + */ + void onMessageViewLongClick(View view, MESSAGE message); + } + /** * Interface used to format your message model when copying. */ @@ -791,7 +942,7 @@ public static class DefaultDateHeaderViewHolder extends ViewHolder public DefaultDateHeaderViewHolder(View itemView) { super(itemView); - text = (TextView) itemView.findViewById(R.id.messageText); + text = itemView.findViewById(R.id.messageText); } @Override diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListStyle.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListStyle.java index a1c06a59..4ea6ed10 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListStyle.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/MessagesListStyle.java @@ -22,17 +22,19 @@ import android.graphics.Color; import android.graphics.Typeface; import android.graphics.drawable.Drawable; -import android.support.annotation.ColorInt; -import android.support.annotation.DrawableRes; -import android.support.v4.graphics.drawable.DrawableCompat; import android.util.AttributeSet; +import androidx.annotation.ColorInt; +import androidx.annotation.DrawableRes; +import androidx.core.graphics.drawable.DrawableCompat; + import com.stfalcon.chatkit.R; import com.stfalcon.chatkit.commons.Style; /** * Style for MessagesListStyle customization by xml attributes */ +@SuppressWarnings("WeakerAccess") class MessagesListStyle extends Style { private int textAutoLinkMask; @@ -230,55 +232,55 @@ private Drawable getMessageSelector(@ColorInt int normalColor, @ColorInt int sel return drawable; } - int getTextAutoLinkMask() { + protected int getTextAutoLinkMask() { return textAutoLinkMask; } - int getIncomingTextLinkColor() { + protected int getIncomingTextLinkColor() { return incomingTextLinkColor; } - int getOutcomingTextLinkColor() { + protected int getOutcomingTextLinkColor() { return outcomingTextLinkColor; } - int getIncomingAvatarWidth() { + protected int getIncomingAvatarWidth() { return incomingAvatarWidth; } - int getIncomingAvatarHeight() { + protected int getIncomingAvatarHeight() { return incomingAvatarHeight; } - int getIncomingDefaultBubblePaddingLeft() { + protected int getIncomingDefaultBubblePaddingLeft() { return incomingDefaultBubblePaddingLeft; } - int getIncomingDefaultBubblePaddingRight() { + protected int getIncomingDefaultBubblePaddingRight() { return incomingDefaultBubblePaddingRight; } - int getIncomingDefaultBubblePaddingTop() { + protected int getIncomingDefaultBubblePaddingTop() { return incomingDefaultBubblePaddingTop; } - int getIncomingDefaultBubblePaddingBottom() { + protected int getIncomingDefaultBubblePaddingBottom() { return incomingDefaultBubblePaddingBottom; } - int getIncomingTextColor() { + protected int getIncomingTextColor() { return incomingTextColor; } - int getIncomingTextSize() { + protected int getIncomingTextSize() { return incomingTextSize; } - int getIncomingTextStyle() { + protected int getIncomingTextStyle() { return incomingTextStyle; } - Drawable getOutcomingBubbleDrawable() { + protected Drawable getOutcomingBubbleDrawable() { if (outcomingBubbleDrawable == -1) { return getMessageSelector(outcomingDefaultBubbleColor, outcomingDefaultBubbleSelectedColor, outcomingDefaultBubblePressedColor, R.drawable.shape_outcoming_message); @@ -287,7 +289,7 @@ Drawable getOutcomingBubbleDrawable() { } } - Drawable getOutcomingImageOverlayDrawable() { + protected Drawable getOutcomingImageOverlayDrawable() { if (outcomingImageOverlayDrawable == -1) { return getMessageSelector(Color.TRANSPARENT, outcomingDefaultImageOverlaySelectedColor, outcomingDefaultImageOverlayPressedColor, R.drawable.shape_outcoming_message); @@ -296,103 +298,103 @@ Drawable getOutcomingImageOverlayDrawable() { } } - int getOutcomingDefaultBubblePaddingLeft() { + protected int getOutcomingDefaultBubblePaddingLeft() { return outcomingDefaultBubblePaddingLeft; } - int getOutcomingDefaultBubblePaddingRight() { + protected int getOutcomingDefaultBubblePaddingRight() { return outcomingDefaultBubblePaddingRight; } - int getOutcomingDefaultBubblePaddingTop() { + protected int getOutcomingDefaultBubblePaddingTop() { return outcomingDefaultBubblePaddingTop; } - int getOutcomingDefaultBubblePaddingBottom() { + protected int getOutcomingDefaultBubblePaddingBottom() { return outcomingDefaultBubblePaddingBottom; } - int getOutcomingTextColor() { + protected int getOutcomingTextColor() { return outcomingTextColor; } - int getOutcomingTextSize() { + protected int getOutcomingTextSize() { return outcomingTextSize; } - int getOutcomingTextStyle() { + protected int getOutcomingTextStyle() { return outcomingTextStyle; } - int getOutcomingTimeTextColor() { + protected int getOutcomingTimeTextColor() { return outcomingTimeTextColor; } - int getOutcomingTimeTextSize() { + protected int getOutcomingTimeTextSize() { return outcomingTimeTextSize; } - int getOutcomingTimeTextStyle() { + protected int getOutcomingTimeTextStyle() { return outcomingTimeTextStyle; } - int getOutcomingImageTimeTextColor() { + protected int getOutcomingImageTimeTextColor() { return outcomingImageTimeTextColor; } - int getOutcomingImageTimeTextSize() { + protected int getOutcomingImageTimeTextSize() { return outcomingImageTimeTextSize; } - int getOutcomingImageTimeTextStyle() { + protected int getOutcomingImageTimeTextStyle() { return outcomingImageTimeTextStyle; } - int getDateHeaderTextColor() { + protected int getDateHeaderTextColor() { return dateHeaderTextColor; } - int getDateHeaderTextSize() { + protected int getDateHeaderTextSize() { return dateHeaderTextSize; } - int getDateHeaderTextStyle() { + protected int getDateHeaderTextStyle() { return dateHeaderTextStyle; } - int getDateHeaderPadding() { + protected int getDateHeaderPadding() { return dateHeaderPadding; } - String getDateHeaderFormat() { + protected String getDateHeaderFormat() { return dateHeaderFormat; } - int getIncomingTimeTextSize() { + protected int getIncomingTimeTextSize() { return incomingTimeTextSize; } - int getIncomingTimeTextStyle() { + protected int getIncomingTimeTextStyle() { return incomingTimeTextStyle; } - int getIncomingTimeTextColor() { + protected int getIncomingTimeTextColor() { return incomingTimeTextColor; } - int getIncomingImageTimeTextColor() { + protected int getIncomingImageTimeTextColor() { return incomingImageTimeTextColor; } - int getIncomingImageTimeTextSize() { + protected int getIncomingImageTimeTextSize() { return incomingImageTimeTextSize; } - int getIncomingImageTimeTextStyle() { + protected int getIncomingImageTimeTextStyle() { return incomingImageTimeTextStyle; } - Drawable getIncomingBubbleDrawable() { + protected Drawable getIncomingBubbleDrawable() { if (incomingBubbleDrawable == -1) { return getMessageSelector(incomingDefaultBubbleColor, incomingDefaultBubbleSelectedColor, incomingDefaultBubblePressedColor, R.drawable.shape_incoming_message); @@ -401,7 +403,7 @@ Drawable getIncomingBubbleDrawable() { } } - Drawable getIncomingImageOverlayDrawable() { + protected Drawable getIncomingImageOverlayDrawable() { if (incomingImageOverlayDrawable == -1) { return getMessageSelector(Color.TRANSPARENT, incomingDefaultImageOverlaySelectedColor, incomingDefaultImageOverlayPressedColor, R.drawable.shape_incoming_message); diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/messages/RecyclerScrollMoreListener.java b/chatkit/src/main/java/com/stfalcon/chatkit/messages/RecyclerScrollMoreListener.java index 92cffc38..f6e61998 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/messages/RecyclerScrollMoreListener.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/messages/RecyclerScrollMoreListener.java @@ -16,10 +16,10 @@ package com.stfalcon.chatkit.messages; -import android.support.v7.widget.GridLayoutManager; -import android.support.v7.widget.LinearLayoutManager; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.StaggeredGridLayoutManager; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.StaggeredGridLayoutManager; class RecyclerScrollMoreListener extends RecyclerView.OnScrollListener { @@ -79,7 +79,7 @@ public void onScrolled(RecyclerView view, int dx, int dy) { int visibleThreshold = 5; if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) { currentPage++; - loadMoreListener.onLoadMore(currentPage, totalItemCount); + loadMoreListener.onLoadMore(loadMoreListener.getMessagesCount(), totalItemCount); loading = true; } } @@ -87,5 +87,7 @@ public void onScrolled(RecyclerView view, int dx, int dy) { interface OnLoadMoreListener { void onLoadMore(int page, int total); + + int getMessagesCount(); } } diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/utils/RoundedImageView.java b/chatkit/src/main/java/com/stfalcon/chatkit/utils/RoundedImageView.java index 91e85142..d53c6f0d 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/utils/RoundedImageView.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/utils/RoundedImageView.java @@ -18,17 +18,18 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.net.Uri; -import android.support.annotation.DimenRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; import android.util.AttributeSet; -import android.widget.ImageView; + +import androidx.annotation.DimenRes; +import androidx.annotation.NonNull; +import androidx.appcompat.widget.AppCompatImageView; +import androidx.core.content.ContextCompat; /** * Thanks to Joonho Kim (https://github.com/pungrue26) for his lightweight SelectableRoundedImageView, * that was used as default image message representation */ -public class RoundedImageView extends ImageView { +public class RoundedImageView extends AppCompatImageView { private int mResource = 0; private Drawable mDrawable; @@ -124,7 +125,7 @@ private void updateDrawable() { ((RoundedCornerDrawable) mDrawable).setCornerRadii(mRadii); } - static class RoundedCornerDrawable extends Drawable { + private static class RoundedCornerDrawable extends Drawable { private RectF mBounds = new RectF(); private final RectF mBitmapRect = new RectF(); @@ -133,17 +134,15 @@ static class RoundedCornerDrawable extends Drawable { private final Paint mBitmapPaint; - private BitmapShader mBitmapShader; - private float[] mRadii = new float[]{0, 0, 0, 0, 0, 0, 0, 0}; private Path mPath = new Path(); private Bitmap mBitmap; private boolean mBoundsConfigured = false; - RoundedCornerDrawable(Bitmap bitmap, Resources r) { + private RoundedCornerDrawable(Bitmap bitmap, Resources r) { mBitmap = bitmap; - mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + BitmapShader mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapWidth = bitmap.getScaledWidth(r.getDisplayMetrics()); mBitmapHeight = bitmap.getScaledHeight(r.getDisplayMetrics()); @@ -155,12 +154,12 @@ static class RoundedCornerDrawable extends Drawable { mBitmapPaint.setShader(mBitmapShader); } - static RoundedCornerDrawable fromBitmap(Bitmap bitmap, Resources r) { + private static RoundedCornerDrawable fromBitmap(Bitmap bitmap, Resources r) { if (bitmap != null) return new RoundedCornerDrawable(bitmap, r); else return null; } - static Drawable fromDrawable(Drawable drawable, Resources r) { + private static Drawable fromDrawable(Drawable drawable, Resources r) { if (drawable != null) { if (drawable instanceof RoundedCornerDrawable) { return drawable; @@ -180,7 +179,7 @@ static Drawable fromDrawable(Drawable drawable, Resources r) { return drawable; } - static Bitmap drawableToBitmap(Drawable drawable) { + private static Bitmap drawableToBitmap(Drawable drawable) { if (drawable == null) return null; if (drawable instanceof BitmapDrawable) { diff --git a/chatkit/src/main/java/com/stfalcon/chatkit/utils/ShapeImageView.java b/chatkit/src/main/java/com/stfalcon/chatkit/utils/ShapeImageView.java index d9717f64..f212468a 100644 --- a/chatkit/src/main/java/com/stfalcon/chatkit/utils/ShapeImageView.java +++ b/chatkit/src/main/java/com/stfalcon/chatkit/utils/ShapeImageView.java @@ -20,21 +20,23 @@ import android.graphics.Canvas; import android.graphics.Path; import android.util.AttributeSet; -import android.widget.ImageView; +import android.view.View; /** * ImageView with mask what described with Bézier Curves */ -public class ShapeImageView extends ImageView { +public class ShapeImageView extends androidx.appcompat.widget.AppCompatImageView { private Path path; public ShapeImageView(Context context) { super(context); + setLayerType(View.LAYER_TYPE_SOFTWARE, null); } public ShapeImageView(Context context, AttributeSet attrs) { super(context, attrs); + setLayerType(View.LAYER_TYPE_SOFTWARE, null); } @Override @@ -56,9 +58,14 @@ protected void onSizeChanged(int w, int h, int oldw, int oldh) { @Override protected void onDraw(Canvas canvas) { - if (canvas != null) { - canvas.clipPath(path); + if (path.isEmpty()) { super.onDraw(canvas); + return; } + + int saveCount = canvas.save(); + canvas.clipPath(path); + super.onDraw(canvas); + canvas.restoreToCount(saveCount); } } diff --git a/chatkit/src/main/res/layout/item_date_header.xml b/chatkit/src/main/res/layout/item_date_header.xml index 3564394c..356aef27 100644 --- a/chatkit/src/main/res/layout/item_date_header.xml +++ b/chatkit/src/main/res/layout/item_date_header.xml @@ -1,6 +1,6 @@ \ No newline at end of file + android:id="@id/messageText" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:gravity="center_horizontal" + android:padding="16dp" /> \ No newline at end of file diff --git a/chatkit/src/main/res/layout/item_dialog.xml b/chatkit/src/main/res/layout/item_dialog.xml index 9820dec2..3e3f8b55 100644 --- a/chatkit/src/main/res/layout/item_dialog.xml +++ b/chatkit/src/main/res/layout/item_dialog.xml @@ -1,7 +1,7 @@ + android:id="@id/dialogRootLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content"> + android:layout_margin="16dp" /> + android:maxLines="1" /> + android:maxLines="1" /> + android:layout_marginRight="7dp" /> + android:maxLines="1" /> @@ -88,7 +88,7 @@ android:ellipsize="end" android:fontFamily="@string/font_fontFamily_medium" android:gravity="center" - android:lines="1"/> + android:lines="1" /> + android:background="@color/dialog_divider" /> diff --git a/chatkit/src/main/res/layout/item_incoming_image_message.xml b/chatkit/src/main/res/layout/item_incoming_image_message.xml index 2685e398..73d614d4 100644 --- a/chatkit/src/main/res/layout/item_incoming_image_message.xml +++ b/chatkit/src/main/res/layout/item_incoming_image_message.xml @@ -1,5 +1,4 @@ - + android:layout_marginRight="8dp" /> + android:layout_toRightOf="@id/messageUserAvatar" /> + android:layout_alignTop="@id/image" /> + android:layout_below="@id/image" /> \ No newline at end of file diff --git a/chatkit/src/main/res/layout/item_incoming_text_message.xml b/chatkit/src/main/res/layout/item_incoming_text_message.xml index 3c35437d..f7ba34b0 100644 --- a/chatkit/src/main/res/layout/item_incoming_text_message.xml +++ b/chatkit/src/main/res/layout/item_incoming_text_message.xml @@ -1,5 +1,4 @@ - + android:layout_marginRight="8dp" /> + android:layout_height="wrap_content" /> + app:layout_alignSelf="center" /> diff --git a/chatkit/src/main/res/layout/item_outcoming_image_message.xml b/chatkit/src/main/res/layout/item_outcoming_image_message.xml index 21712d4f..0149b461 100644 --- a/chatkit/src/main/res/layout/item_outcoming_image_message.xml +++ b/chatkit/src/main/res/layout/item_outcoming_image_message.xml @@ -1,5 +1,4 @@ - + android:layout_marginStart="@dimen/message_outcoming_bubble_margin_left" /> + android:layout_alignTop="@id/image" /> + android:layout_below="@id/image" /> \ No newline at end of file diff --git a/chatkit/src/main/res/layout/item_outcoming_text_message.xml b/chatkit/src/main/res/layout/item_outcoming_text_message.xml index 51e5aeaa..58e58351 100644 --- a/chatkit/src/main/res/layout/item_outcoming_text_message.xml +++ b/chatkit/src/main/res/layout/item_outcoming_text_message.xml @@ -1,5 +1,4 @@ - + android:layout_alignWithParentIfMissing="true" /> + app:layout_order="1" /> diff --git a/chatkit/src/main/res/layout/view_message_input.xml b/chatkit/src/main/res/layout/view_message_input.xml index aaed1f5f..9ab1b4d9 100644 --- a/chatkit/src/main/res/layout/view_message_input.xml +++ b/chatkit/src/main/res/layout/view_message_input.xml @@ -1,5 +1,4 @@ - @@ -8,14 +7,14 @@ android:id="@id/attachmentButton" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_centerVertical="true"/> + android:layout_centerVertical="true" /> - + android:layout_toRightOf="@id/attachmentButton" /> + android:inputType="textAutoCorrect|textAutoComplete|textMultiLine|textCapSentences" /> - + android:layout_toStartOf="@id/messageSendButton" /> + android:layout_centerVertical="true" /> \ No newline at end of file diff --git a/chatkit/src/main/res/values/attrs.xml b/chatkit/src/main/res/values/attrs.xml index dca85be2..4e996630 100644 --- a/chatkit/src/main/res/values/attrs.xml +++ b/chatkit/src/main/res/values/attrs.xml @@ -1,225 +1,227 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - + + + + + + - - + + - - + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - - - - + + + + - - + + - - - + + + - - + + - - - + + + - - + + - - - + + + - - - - + + + + - - - + + + - + - - + + - - - + + + - + - - - + + + - - + + - - - + + + - + - - - + + + - - + + - - - + + + - + - - - + + + - - - + + + - - - + + + - + - - + + - - - + + + - - - - + + + + - - + + diff --git a/chatkit/src/main/res/values/strings.xml b/chatkit/src/main/res/values/strings.xml index ea100eae..2c5844dd 100644 --- a/chatkit/src/main/res/values/strings.xml +++ b/chatkit/src/main/res/values/strings.xml @@ -1 +1 @@ - + diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0c0bb994..32e427f5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,3 +1,37 @@ +## Version 0.3.3 (2018/10/12) +* Merged: Added upsert method to move a specific item to the start. [#209](https://github.com/stfalcon-studio/ChatKit/pull/209) + +## Version 0.3.2 (2018/09/28) +* [Passing custom data to ImageLoader](https://github.com/stfalcon-studio/ChatKit/issues/183) +* Fixed [#198](https://github.com/stfalcon-studio/ChatKit/issues/198) +* Protected `items` field in `MessagesListAdapter` and `DialogsListAdapte` [#188](https://github.com/stfalcon-studio/ChatKit/issues/188) +* Fixed `delete` and `deleteByIds` methods in MessagesListAdapter +* Merged: Clear last message if null in dialog list (Fix issue #189) [#190](https://github.com/stfalcon-studio/ChatKit/pull/190) +* Merged: Add upsert method to dialogs list [#191](https://github.com/stfalcon-studio/ChatKit/pull/191) +* Merged: Update documentation to add upsertItem method [#208](https://github.com/stfalcon-studio/ChatKit/pull/208) + +## Version 0.3.1 (2018/08/16) +* [Passing custom data to your ViewHolder](https://github.com/stfalcon-studio/ChatKit/blob/master/docs/COMPONENT_MESSAGES_LIST.md#passing-custom-data-to-your-viewholder) [#180](https://github.com/stfalcon-studio/ChatKit/issues/180) +* Added Proguard rules to [Readme](https://github.com/stfalcon-studio/ChatKit#proguard) and [sample project](https://github.com/stfalcon-studio/ChatKit/blob/master/sample/proguard-rules.pro). [#122](https://github.com/stfalcon-studio/ChatKit/issues/122) +* Fixed [#174](https://github.com/stfalcon-studio/ChatKit/issues/174) + +## Version 0.3.0 (2018/07/12) +* [Added Typing Listener to MessageInput](https://github.com/stfalcon-studio/ChatKit/blob/master/docs/COMPONENT_MESSAGE_INPUT.MD#typing-listener). Thanks to [toanpv](https://github.com/toanpv); +* Fixed artifacts with bubble background in message list; +* Added separate method MessagesListAdapter.clear(notifyDataSetChanged). Method MessagesListAdapter.clear() does notifyDataSetChanged by default. [#89](https://github.com/stfalcon-studio/ChatKit/issues/86); +* Fixed "The totalItemsCount parameter in OnLoadMore callback contains date header." [#86](https://github.com/stfalcon-studio/ChatKit/issues/86); +* Merged pull requests: + * Avoid Crash on empty list in addToEnd [#146](https://github.com/stfalcon-studio/ChatKit/pull/146); + * Fix link typo in docs [#134](https://github.com/stfalcon-studio/ChatKit/pull/134); + * Add nullable for getImageUrl() [#119](https://github.com/stfalcon-studio/ChatKit/pull/119); + * Made correction to DialogList documentation [#112](https://github.com/stfalcon-studio/ChatKit/pull/112); + * Allow moving Dialog item and get Dialog by id [#70](https://github.com/stfalcon-studio/ChatKit/pull/70); + * Allow the user to get the current position of a DIALOG [#32](https://github.com/stfalcon-studio/ChatKit/pull/32); + * Added upsert(Message) method to add or update message to adapter as appropriate [#61](https://github.com/stfalcon-studio/ChatKit/pull/61); + * Create LICENSE [#167](https://github.com/stfalcon-studio/ChatKit/pull/167); + * NPE check in DialofsListAdapter.java when there is no last message (is null) [#75](https://github.com/stfalcon-studio/ChatKit/pull/75); +* Sample: Fixed artifacts on some devices in ShapeImageView. Changed fixture message image. + ## Version 0.2.0 (2017/04/07) * [Default image type](COMPONENT_MESSAGES_LIST.md#adding-image-message); diff --git a/docs/COMPONENT_DIALOGS_LIST.MD b/docs/COMPONENT_DIALOGS_LIST.MD index 9b4f72ce..21763d0b 100644 --- a/docs/COMPONENT_DIALOGS_LIST.MD +++ b/docs/COMPONENT_DIALOGS_LIST.MD @@ -36,7 +36,7 @@ dialogsListView.setAdapter(dialogsListAdapter); #### Prepare your model -To be able to add dialog, you must implement the `IDealog` interface to your existing model and override its methods: +To be able to add dialog, you must implement the `IDialog` interface to your existing model and override its methods: ```java public class DefaultDialog implements IDialog { @@ -113,8 +113,9 @@ When your models are ready to be used by adapter, you can simply add them to the * adapter.setItems(List items) - replaces existing list with a new dialog list; * adapter.addItems(List items) - adds a new dialog list to the end of the list; -* adapter.addItem(DIALOG dialog) - adds a new dialog to the specified position; -* adapter.addItem(int position, DIALOG dialog) - adds one dialog to the end of the list. +* adapter.addItem(DIALOG dialog) - adds one dialog to the end of the list +* adapter.addItem(int position, DIALOG dialog) - adds a new dialog to the specified position. +* adapter.upsertItem(DIALOG dialog) - adds one dialog to the end of the list if not exists, otherwise updates the existing dialog. #### Updating dialogs If dialog has changed, you can update it by position in list by calling `adapter.updateItem(int position, DIALOG item)` or update it by dialog id by calling `adapter.updateItemById(DIALOG item)` @@ -220,7 +221,7 @@ But what if changing appearance is not enough? Not a problem, create your own la * `@id/dialogDividerContainer` (ViewGroup) * `@id/dialogDivider` (View) -For better understanding see how [custom layout looks like](https://github.com/stfalcon-studio/ChatKit/blob/master/sample/src/main/res/layout/item_dialog_custom.xml). +For better understanding see how [custom layout looks like](https://github.com/stfalcon-studio/ChatKit/blob/master/sample/src/main/res/layout/item_custom_dialog.xml). After creating layout you need to transfer it to the adapter’s constructor. ```java diff --git a/docs/COMPONENT_MESSAGES_LIST.md b/docs/COMPONENT_MESSAGES_LIST.md index 707a9d5e..cff2a03e 100644 --- a/docs/COMPONENT_MESSAGES_LIST.md +++ b/docs/COMPONENT_MESSAGES_LIST.md @@ -147,7 +147,7 @@ If message has changed, you can update it by calling `adapter.update(IMessage me #### Click listeners -Of course, the adapter have listeners for such important actions as short and long clicks. They just returns a message object that has been pressed, with a type that is specified as the generic type of adapter: +Of course, the adapter has listeners for such important actions as short and long clicks. They just returns a message object that has been pressed, with a type that is specified as the generic type of adapter: ```java public interface OnMessageClickListener { @@ -157,6 +157,12 @@ public interface OnMessageLongClickListener { void onMessageLongClick(MESSAGE message); } ``` + +Also here is an ability to set listeners on separate Views in message item: +``` +public void registerViewClickListener(int viewId, OnMessageViewClickListener onMessageViewClickListener) +``` + #### Links highlighting In 99% of cases the user is confused, when he can not follow the link or call the phone, indicated in the message. If you think the same way, just include `textAutoLink="all"`, like in the ordinary `TextView`. Similarly, you can specify highlighting for certain types, for example, `email|phone|web`:

@@ -276,7 +282,7 @@ But what if you need not only to change the appearance of the elements, but also * `@id/messageTime` (TextView) * `@id/messageUserAvatar` (ImageView) -For better understanding see how [custom layout looks like](https://github.com/stfalcon-studio/ChatKit/blob/master/sample/src/main/res/layout/item_custom_incoming_message.xml) +For better understanding see how [custom layout looks like](https://github.com/stfalcon-studio/ChatKit/blob/master/sample/src/main/res/layout/item_custom_incoming_text_message.xml) After a layout was created, you need to put it into `HoldersConfig` object, which has appropriate methods for each layout files: `setIncomingLayout(int layoutRes)`, `setOutcomingLayout(int layoutRes)` `setDateHeaderLayout(int layoutRes)`. To hook up a config object, you need to transfer it to adapter through a constructor: @@ -315,8 +321,8 @@ For example, you can add status for outgoing messages with only few lines: public class CustomOutcomingMessageViewHolder extends MessagesListAdapter.OutcomingMessageViewHolder { - public CustomOutcomingMessageViewHolder(View itemView) { - super(itemView); + public CustomOutcomingMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); } @Override @@ -332,6 +338,58 @@ public class CustomOutcomingMessageViewHolder

Pay attention to outgoing message’ status and online indicator.

+#### Passing custom data to your ViewHolder +You can pass any data to your custom ViewHolder. To do this, firstly you need override the constructor `super(View itemView, Object payload)` (the constructor `super(View itemView)` is deprecated and will be deleted in one of the new version of library). After that you can pass data as third parameter in method `MessageHolders().setXXXConfig`. +For example, let's add click listener in incoming text message on avatar click. +Create interface for click callback and payload class to store it: +```java +public interface OnAvatarClickListener { + void onAvatarClick(); +} + +public class Payload { + public OnAvatarClickListener avatarClickListener; +} +``` +Then in our custom ViewHolder in method `onBind`: +```java +@Override + public void onBind(Message message) { + super.onBind(message); + ... + //We can set click listener on view from payload + final Payload payload = (Payload) this.payload; + userAvatar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (payload != null && payload.avatarClickListener != null) { + payload.avatarClickListener.onAvatarClick(); + } + } + }); + } +``` +Then create Payload and set it and our ViewHolder class to MessageHolders config. +```java +//We can pass any data to ViewHolder with payload +CustomIncomingTextMessageViewHolder.Payload payload = new CustomIncomingTextMessageViewHolder.Payload(); +//For example click listener +payload.avatarClickListener = new CustomIncomingTextMessageViewHolder.OnAvatarClickListener() { + @Override + public void onAvatarClick() { + Toast.makeText(CustomHolderMessagesActivity.this, + "Text message avatar clicked", Toast.LENGTH_SHORT).show(); + } +}; + +MessageHolders holdersConfig = new MessageHolders() + .setIncomingTextConfig( + CustomIncomingTextMessageViewHolder.class, + R.layout.item_custom_incoming_text_message, + payload) + ... +``` + #### Custom content types We understand that ony images as media messages are often not enough. Therefore, we implemented the ability to add custom content types for displaying different types of content (geopoints, video, voice messages etc.). @@ -369,4 +427,4 @@ If the `hasContentFor` method returns `true` for the selected type, the correspo As the result, well get the following:

-

\ No newline at end of file +

diff --git a/docs/COMPONENT_MESSAGE_INPUT.MD b/docs/COMPONENT_MESSAGE_INPUT.MD index 6c49542e..72165205 100644 --- a/docs/COMPONENT_MESSAGE_INPUT.MD +++ b/docs/COMPONENT_MESSAGE_INPUT.MD @@ -47,6 +47,24 @@ messageInput.setAttachmentsListener(new MessageInput.AttachmentsListener() { }); ``` +#### Typing Listener + +If you want to track typing event: +```java +messageInput.setTypingListener(new MessageInput.TypingListener() { + @Override + public void onStartTyping() { + + } + + @Override + public void onStopTyping() { + + } + }); +``` +Default delay typing is 1500, you can change it with only one line `delayTypingStatus="delayInMilis"` + #### Make it look the way you want By using available widget attribute you can change color and size of text and input hint, maximum number of permitted lines, size and indents “submit” button, and its icon and background. diff --git a/docs/STYLES_ATTR.md b/docs/STYLES_ATTR.md index df2075e4..7c04e9c9 100644 --- a/docs/STYLES_ATTR.md +++ b/docs/STYLES_ATTR.md @@ -37,7 +37,7 @@ | `dialogItemBackground` | Sets background of dialogs items| | `dialogItemBackground` | Sets background of dialogs items when has unread messages | -## [MessagesList]](COMPONENT_MESSAGES_LIST.md) xml attributes: +## [MessagesList](COMPONENT_MESSAGES_LIST.md) xml attributes: | Attribute | Description| | ------------- |-------------| @@ -126,4 +126,5 @@ | `inputTextColor` | Sets input message text color| | `inputHintColor` | Sets text color of hint in message input field| | `inputBackground` | Sets background for input message view | -| `inputCursorDrawable` | Sets cursor drawable for input message EditText | \ No newline at end of file +| `inputCursorDrawable` | Sets cursor drawable for input message EditText | +| `delayTypingStatus` | Sets delay typing for TypingListener| diff --git a/gradle.properties b/gradle.properties index aac7c9b4..de89bf94 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,16 @@ # Project-wide Gradle settings. - # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. - # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html - # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. org.gradle.jvmargs=-Xmx1536m - # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..13372aef Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fb4882dc..b12ede36 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Apr 06 11:02:19 EEST 2017 +#Tue Feb 09 17:12:38 EET 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip diff --git a/gradlew b/gradlew index 27309d92..dc2f857e 100755 --- a/gradlew +++ b/gradlew @@ -10,22 +10,22 @@ # Resolve links: $0 may be a link PRG="$0" # Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +while [ -h "$PRG" ]; do + ls=$(ls -ld "$PRG") + link=$(expr "$ls" : '.*-> \(.*\)$') + if expr "$link" : '/.*' >/dev/null; then + PRG="$link" + else + PRG=$(dirname "$PRG")"/$link" + fi done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" +SAVED="$(pwd)" +cd "$(dirname \"$PRG\")/" >/dev/null +APP_HOME="$(pwd -P)" cd "$SAVED" >/dev/null APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=$(basename "$0") # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS="" @@ -33,15 +33,15 @@ DEFAULT_JVM_OPTS="" # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" -warn ( ) { - echo "$*" +warn() { + echo "$*" } -die ( ) { - echo - echo "$*" - echo - exit 1 +die() { + echo + echo "$*" + echo + exit 1 } # OS specific support (must be 'true' or 'false'). @@ -49,114 +49,114 @@ cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$(uname)" in +CYGWIN*) + cygwin=true + ;; +Darwin*) + darwin=true + ;; +MINGW*) + msys=true + ;; +NONSTOP*) + nonstop=true + ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -n "$JAVA_HOME" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ]; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi + fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ]; then + MAX_FD_LIMIT=$(ulimit -H -n) + if [ $? -eq 0 ]; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ]; then + MAX_FD="$MAX_FD_LIMIT" fi + ulimit -n $MAX_FD + if [ $? -ne 0 ]; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi fi # For Darwin, add options to specify how the application appears in the dock if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi # For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" +if $cygwin; then + APP_HOME=$(cygpath --path --mixed "$APP_HOME") + CLASSPATH=$(cygpath --path --mixed "$CLASSPATH") + JAVACMD=$(cygpath --unix "$JAVACMD") + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=$(find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null) + SEP="" + for dir in $ROOTDIRSRAW; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ]; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@"; do + CHECK=$(echo "$arg" | egrep -c "$OURCYGPATTERN" -) + CHECK2=$(echo "$arg" | egrep -c "^-") ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ]; then ### Added a condition + eval $(echo args$i)=$(cygpath --path --ignore --mixed "$arg") + else + eval $(echo args$i)="\"$arg\"" fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac + i=$((i + 1)) + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac fi # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules function splitJvmOpts() { - JVM_OPTS=("$@") + JVM_OPTS=("$@") } eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" diff --git a/sample/build.gradle b/sample/build.gradle index d000b209..ec6c1258 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,15 +1,14 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" + compileSdkVersion 29 + buildToolsVersion '29.0.2' defaultConfig { applicationId "com.stfalcon.chatkit.sample" - minSdkVersion 16 - targetSdkVersion 25 + minSdkVersion 14 versionCode 1 versionName "1.0" - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' } buildTypes { release { @@ -22,36 +21,34 @@ android { abortOnError false } } -} -ext { - supportVersion = '25.1.1' - picassoVersion = '2.5.2' - circleImageViewVersion = '2.1.0' - shapeImageViewVersion = '0.9.3' - circleindicatorVersion = '1.2.2@aar' + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { - compile project(':chatkit') + implementation project(':chatkit') - compile fileTree(dir: 'libs', include: ['*.jar']) - androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { + implementation fileTree(dir: 'libs', include: ['*.jar']) + androidTestImplementation('androidx.test.espresso:espresso-core:3.1.0', { exclude group: 'com.android.support', module: 'support-annotations' }) - testCompile 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' - compile "com.android.support:appcompat-v7:$supportVersion" - compile "com.android.support:cardview-v7:$supportVersion" - compile "com.android.support:design:$supportVersion" + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'com.google.android.material:material:1.2.1' //Picasso - compile "com.squareup.picasso:picasso:$picassoVersion" + implementation "com.squareup.picasso:picasso:2.71828" //ImageViews - compile "de.hdodenhof:circleimageview:$circleImageViewVersion" - compile "com.github.siyamed:android-shape-imageview:$shapeImageViewVersion" + implementation "de.hdodenhof:circleimageview:2.2.0" + implementation "com.github.siyamed:android-shape-imageview:0.9.3" //Utils - compile "me.relex:circleindicator:$circleindicatorVersion" + implementation "me.relex:circleindicator:1.2.2@aar" + } diff --git a/sample/proguard-rules.pro b/sample/proguard-rules.pro index 7e694d20..2995e8d9 100644 --- a/sample/proguard-rules.pro +++ b/sample/proguard-rules.pro @@ -15,3 +15,99 @@ #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} +# JSR 305 annotations are for embedding nullability information. +-dontwarn javax.annotation.** + +# A resource is loaded with a relative path so the package of this class must be preserved. +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase + +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* + +# OkHttp platform used only on JVM and when Conscrypt dependency is available. +-dontwarn okhttp3.internal.platform.ConscryptPlatform + + +-dontwarn okio.** +-dontwarn com.squareup.okhttp.** +-dontwarn okhttp3.** +-dontwarn javax.annotation.** + +-keep public class * extends android.app.Activity +-keep public class * extends android.app.Application +-keep public class * extends android.app.Service +-keep public class * extends android.content.BroadcastReceiver +-keep public class * extends android.content.ContentProvider +-keep public class * extends android.app.backup.BackupAgent +-keep public class * extends android.preference.Preference +-keep public class * extends android.support.v4.app.Fragment +-keep public class * extends android.support.v4.app.DialogFragment +-keep public class * extends android.app.Fragment +-keep public class com.android.vending.licensing.ILicensingService + +# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native +-keepclasseswithmembernames class * { + native ; +} + +-keep public class * extends android.view.View { + public (android.content.Context); + public (android.content.Context, android.util.AttributeSet); + public (android.content.Context, android.util.AttributeSet, int); + public void set*(...); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet); +} + +-keepclasseswithmembers class * { + public (android.content.Context, android.util.AttributeSet, int); +} + +-keepclassmembers class * extends android.app.Activity { + public void *(android.view.View); +} + +# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations +-keepclassmembers enum * { + public static **[] values(); + public static ** valueOf(java.lang.String); +} + +-keep class * implements android.os.Parcelable { + public static final android.os.Parcelable$Creator *; +} + +-keepclassmembers class **.R$* { + public static ; +} +-keep class android.support.v7.internal.** { *; } +-keep interface android.support.v7.internal.** { *; } +-keep class android.support.v7.** { *; } +-keep interface android.support.v7.** { *; } +# The support library contains references to newer platform versions. +# Don't warn about those in case this app is linking against an older +# platform version. We know about them, and they are safe. +-dontwarn android.support.** + + + +#FOR CHATKIT + +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingTextMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingTextMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingImageMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } +-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingImageMessageViewHolder { + public (android.view.View, java.lang.Object); + public (android.view.View); + } diff --git a/sample/src/androidTest/java/com/stfalcon/chatkit/sample/ExampleInstrumentedTest.java b/sample/src/androidTest/java/com/stfalcon/chatkit/sample/ExampleInstrumentedTest.java index 9ba761a3..ff85a942 100644 --- a/sample/src/androidTest/java/com/stfalcon/chatkit/sample/ExampleInstrumentedTest.java +++ b/sample/src/androidTest/java/com/stfalcon/chatkit/sample/ExampleInstrumentedTest.java @@ -1,13 +1,14 @@ package com.stfalcon.chatkit.sample; import android.content.Context; -import android.support.test.InstrumentationRegistry; -import android.support.test.runner.AndroidJUnit4; + +import androidx.test.InstrumentationRegistry; +import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; /** * Instrumentation test, which will execute on an Android device. diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index e95c5cbb..6526cb56 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + package="com.stfalcon.chatkit.sample"> - + - - + + + android:theme="@style/BlueTheme" /> - - - - - - + android:theme="@style/BlueTheme" /> + + + + + + + android:theme="@style/BlueTheme" /> diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/fixtures/FixturesData.java b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/fixtures/FixturesData.java index 6f7d35bc..ead984e3 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/fixtures/FixturesData.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/fixtures/FixturesData.java @@ -71,7 +71,7 @@ abstract class FixturesData { static final ArrayList images = new ArrayList() { { add("https://habrastorage.org/getpro/habr/post_images/e4b/067/b17/e4b067b17a3e414083f7420351db272b.jpg"); - add("http://www.designboom.com/wp-content/uploads/2015/11/stefano-boeri-architetti-vertical-forest-residential-tower-lausanne-switzerland-designboom-01.jpg"); + add("https://cdn.pixabay.com/photo/2017/12/25/17/48/waters-3038803_1280.jpg"); } }; diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Dialog.java b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Dialog.java index 36584756..7f239df6 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Dialog.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/common/data/model/Dialog.java @@ -62,4 +62,8 @@ public void setLastMessage(Message lastMessage) { public int getUnreadCount() { return unreadCount; } + + public void setUnreadCount(int unreadCount) { + this.unreadCount = unreadCount; + } } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java index f2848ba8..51d649c3 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoDialogsActivity.java @@ -1,9 +1,9 @@ package com.stfalcon.chatkit.sample.features.demo; import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; -import android.widget.ImageView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import com.squareup.picasso.Picasso; import com.stfalcon.chatkit.commons.ImageLoader; @@ -25,12 +25,7 @@ public abstract class DemoDialogsActivity extends AppCompatActivity protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - imageLoader = new ImageLoader() { - @Override - public void loadImage(ImageView imageView, String url) { - Picasso.with(DemoDialogsActivity.this).load(url).into(imageView); - } - }; + imageLoader = (imageView, url, payload) -> Picasso.get().load(url).into(imageView); } @Override diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoMessagesActivity.java index 0fedc8cf..5566a519 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/DemoMessagesActivity.java @@ -2,11 +2,12 @@ import android.os.Bundle; import android.os.Handler; -import android.support.annotation.Nullable; -import android.support.v7.app.AppCompatActivity; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.widget.ImageView; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import com.squareup.picasso.Picasso; import com.stfalcon.chatkit.commons.ImageLoader; @@ -42,12 +43,7 @@ public abstract class DemoMessagesActivity extends AppCompatActivity protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - imageLoader = new ImageLoader() { - @Override - public void loadImage(ImageView imageView, String url) { - Picasso.with(DemoMessagesActivity.this).load(url).into(imageView); - } - }; + imageLoader = (imageView, url, payload) -> Picasso.get().load(url).into(imageView); } @Override @@ -89,6 +85,7 @@ public void onBackPressed() { @Override public void onLoadMore(int page, int totalItemsCount) { + Log.i("TAG", "onLoadMore: " + page + " " + totalItemsCount); if (totalItemsCount < TOTAL_MESSAGES_COUNT) { loadMessages(); } @@ -102,29 +99,24 @@ public void onSelectionChanged(int count) { } protected void loadMessages() { - new Handler().postDelayed(new Runnable() { //imitation of internet connection - @Override - public void run() { - ArrayList messages = MessagesFixtures.getMessages(lastLoadedDate); - lastLoadedDate = messages.get(messages.size() - 1).getCreatedAt(); - messagesAdapter.addToEnd(messages, false); - } + //imitation of internet connection + new Handler().postDelayed(() -> { + ArrayList messages = MessagesFixtures.getMessages(lastLoadedDate); + lastLoadedDate = messages.get(messages.size() - 1).getCreatedAt(); + messagesAdapter.addToEnd(messages, false); }, 1000); } private MessagesListAdapter.Formatter getMessageStringFormatter() { - return new MessagesListAdapter.Formatter() { - @Override - public String format(Message message) { - String createdAt = new SimpleDateFormat("MMM d, EEE 'at' h:mm a", Locale.getDefault()) - .format(message.getCreatedAt()); - - String text = message.getText(); - if (text == null) text = "[attachment]"; - - return String.format(Locale.getDefault(), "%s: %s (%s)", - message.getUser().getName(), text, createdAt); - } + return message -> { + String createdAt = new SimpleDateFormat("MMM d, EEE 'at' h:mm a", Locale.getDefault()) + .format(message.getCreatedAt()); + + String text = message.getText(); + if (text == null) text = "[attachment]"; + + return String.format(Locale.getDefault(), "%s: %s (%s)", + message.getUser().getName(), text, createdAt); }; } } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderDialogsActivity.java index c08df41d..188aa038 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderDialogsActivity.java @@ -25,7 +25,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_holder_dialogs); - dialogsList = (DialogsList) findViewById(R.id.dialogsList); + dialogsList = findViewById(R.id.dialogsList); initAdapter(); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderMessagesActivity.java index 6ec42903..0a59d16f 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/CustomHolderMessagesActivity.java @@ -3,6 +3,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.widget.Toast; import com.stfalcon.chatkit.messages.MessageHolders; import com.stfalcon.chatkit.messages.MessageInput; @@ -34,10 +35,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_holder_messages); - messagesList = (MessagesList) findViewById(R.id.messagesList); + messagesList = findViewById(R.id.messagesList); initAdapter(); - MessageInput input = (MessageInput) findViewById(R.id.input); + MessageInput input = findViewById(R.id.input); input.setInputListener(this); input.setAttachmentsListener(this); } @@ -60,10 +61,18 @@ public void onMessageLongClick(Message message) { } private void initAdapter() { + + //We can pass any data to ViewHolder with payload + CustomIncomingTextMessageViewHolder.Payload payload = new CustomIncomingTextMessageViewHolder.Payload(); + //For example click listener + payload.avatarClickListener = () -> Toast.makeText(CustomHolderMessagesActivity.this, + "Text message avatar clicked", Toast.LENGTH_SHORT).show(); + MessageHolders holdersConfig = new MessageHolders() .setIncomingTextConfig( CustomIncomingTextMessageViewHolder.class, - R.layout.item_custom_incoming_text_message) + R.layout.item_custom_incoming_text_message, + payload) .setOutcomingTextConfig( CustomOutcomingTextMessageViewHolder.class, R.layout.item_custom_outcoming_text_message) diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java index 47e9282a..124b4cc4 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingImageMessageViewHolder.java @@ -14,8 +14,8 @@ public class CustomIncomingImageMessageViewHolder private View onlineIndicator; - public CustomIncomingImageMessageViewHolder(View itemView) { - super(itemView); + public CustomIncomingImageMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); onlineIndicator = itemView.findViewById(R.id.onlineIndicator); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java index c4df3e95..fee813c1 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomIncomingTextMessageViewHolder.java @@ -11,8 +11,8 @@ public class CustomIncomingTextMessageViewHolder private View onlineIndicator; - public CustomIncomingTextMessageViewHolder(View itemView) { - super(itemView); + public CustomIncomingTextMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); onlineIndicator = itemView.findViewById(R.id.onlineIndicator); } @@ -26,5 +26,21 @@ public void onBind(Message message) { } else { onlineIndicator.setBackgroundResource(R.drawable.shape_bubble_offline); } + + //We can set click listener on view from payload + final Payload payload = (Payload) this.payload; + userAvatar.setOnClickListener(view -> { + if (payload != null && payload.avatarClickListener != null) { + payload.avatarClickListener.onAvatarClick(); + } + }); + } + + public static class Payload { + public OnAvatarClickListener avatarClickListener; + } + + public interface OnAvatarClickListener { + void onAvatarClick(); } } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingImageMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingImageMessageViewHolder.java index 36a22359..484ce026 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingImageMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingImageMessageViewHolder.java @@ -1,5 +1,6 @@ package com.stfalcon.chatkit.sample.features.demo.custom.holder.holders.messages; +import android.util.Pair; import android.view.View; import com.stfalcon.chatkit.messages.MessageHolders; @@ -11,8 +12,8 @@ public class CustomOutcomingImageMessageViewHolder extends MessageHolders.OutcomingImageMessageViewHolder { - public CustomOutcomingImageMessageViewHolder(View itemView) { - super(itemView); + public CustomOutcomingImageMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); } @Override @@ -21,4 +22,11 @@ public void onBind(Message message) { time.setText(message.getStatus() + " " + time.getText()); } + + //Override this method to have ability to pass custom data in ImageLoader for loading image(not avatar). + @Override + protected Object getPayloadForImageLoader(Message message) { + //For example you can pass size of placeholder before loading + return new Pair<>(100, 100); + } } \ No newline at end of file diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingTextMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingTextMessageViewHolder.java index 81c319d2..aa3a445b 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingTextMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/holder/holders/messages/CustomOutcomingTextMessageViewHolder.java @@ -8,8 +8,8 @@ public class CustomOutcomingTextMessageViewHolder extends MessageHolders.OutcomingTextMessageViewHolder { - public CustomOutcomingTextMessageViewHolder(View itemView) { - super(itemView); + public CustomOutcomingTextMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); } @Override diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutDialogsActivity.java index b8bddf84..faaea0b3 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutDialogsActivity.java @@ -24,7 +24,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_layout_dialogs); - dialogsList = (DialogsList) findViewById(R.id.dialogsList); + dialogsList = findViewById(R.id.dialogsList); initAdapter(); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutMessagesActivity.java index d7d7c14f..12e7749b 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/layout/CustomLayoutMessagesActivity.java @@ -30,10 +30,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_layout_messages); - messagesList = (MessagesList) findViewById(R.id.messagesList); + messagesList = findViewById(R.id.messagesList); initAdapter(); - MessageInput input = (MessageInput) findViewById(R.id.input); + MessageInput input = findViewById(R.id.input); input.setInputListener(this); input.setAttachmentsListener(this); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/CustomMediaMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/CustomMediaMessagesActivity.java index 7f3ae57f..caf47d13 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/CustomMediaMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/CustomMediaMessagesActivity.java @@ -36,10 +36,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_media_messages); - this.messagesList = (MessagesList) findViewById(R.id.messagesList); + this.messagesList = findViewById(R.id.messagesList); initAdapter(); - MessageInput input = (MessageInput) findViewById(R.id.input); + MessageInput input = findViewById(R.id.input); input.setInputListener(this); input.setAttachmentsListener(this); } @@ -60,11 +60,10 @@ public void onAddAttachments() { @Override public boolean hasContentFor(Message message, byte type) { - switch (type) { - case CONTENT_TYPE_VOICE: - return message.getVoice() != null - && message.getVoice().getUrl() != null - && !message.getVoice().getUrl().isEmpty(); + if (type == CONTENT_TYPE_VOICE) { + return message.getVoice() != null + && message.getVoice().getUrl() != null + && !message.getVoice().getUrl().isEmpty(); } return false; } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/IncomingVoiceMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/IncomingVoiceMessageViewHolder.java index c87e395f..bdacb34a 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/IncomingVoiceMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/IncomingVoiceMessageViewHolder.java @@ -18,10 +18,10 @@ public class IncomingVoiceMessageViewHolder private TextView tvDuration; private TextView tvTime; - public IncomingVoiceMessageViewHolder(View itemView) { - super(itemView); - tvDuration = (TextView) itemView.findViewById(R.id.duration); - tvTime = (TextView) itemView.findViewById(R.id.time); + public IncomingVoiceMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); + tvDuration = itemView.findViewById(R.id.duration); + tvTime = itemView.findViewById(R.id.time); } @Override diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/OutcomingVoiceMessageViewHolder.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/OutcomingVoiceMessageViewHolder.java index 556e1fcf..b21db7d7 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/OutcomingVoiceMessageViewHolder.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/custom/media/holders/OutcomingVoiceMessageViewHolder.java @@ -18,10 +18,10 @@ public class OutcomingVoiceMessageViewHolder private TextView tvDuration; private TextView tvTime; - public OutcomingVoiceMessageViewHolder(View itemView) { - super(itemView); - tvDuration = (TextView) itemView.findViewById(R.id.duration); - tvTime = (TextView) itemView.findViewById(R.id.time); + public OutcomingVoiceMessageViewHolder(View itemView, Object payload) { + super(itemView, payload); + tvDuration = itemView.findViewById(R.id.duration); + tvTime = itemView.findViewById(R.id.time); } @Override diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultDialogsActivity.java index b9cf7444..c88a3771 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultDialogsActivity.java @@ -12,12 +12,8 @@ import com.stfalcon.chatkit.sample.common.data.model.Message; import com.stfalcon.chatkit.sample.features.demo.DemoDialogsActivity; -import java.util.ArrayList; - public class DefaultDialogsActivity extends DemoDialogsActivity { - private ArrayList dialogs; - public static void open(Context context) { context.startActivity(new Intent(context, DefaultDialogsActivity.class)); } @@ -29,7 +25,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_default_dialogs); - dialogsList = (DialogsList) findViewById(R.id.dialogsList); + dialogsList = findViewById(R.id.dialogsList); initAdapter(); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultMessagesActivity.java index 0dcb32f7..a74bca89 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/def/DefaultMessagesActivity.java @@ -3,6 +3,7 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.util.Log; import com.stfalcon.chatkit.messages.MessageInput; import com.stfalcon.chatkit.messages.MessagesList; @@ -10,10 +11,12 @@ import com.stfalcon.chatkit.sample.R; import com.stfalcon.chatkit.sample.common.data.fixtures.MessagesFixtures; import com.stfalcon.chatkit.sample.features.demo.DemoMessagesActivity; +import com.stfalcon.chatkit.sample.utils.AppUtils; public class DefaultMessagesActivity extends DemoMessagesActivity implements MessageInput.InputListener, - MessageInput.AttachmentsListener { + MessageInput.AttachmentsListener, + MessageInput.TypingListener { public static void open(Context context) { context.startActivity(new Intent(context, DefaultMessagesActivity.class)); @@ -26,11 +29,13 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_default_messages); - this.messagesList = (MessagesList) findViewById(R.id.messagesList); + this.messagesList = findViewById(R.id.messagesList); initAdapter(); - MessageInput input = (MessageInput) findViewById(R.id.input); + MessageInput input = findViewById(R.id.input); input.setInputListener(this); + input.setTypingListener(this); + input.setAttachmentsListener(this); } @Override @@ -50,6 +55,20 @@ private void initAdapter() { super.messagesAdapter = new MessagesListAdapter<>(super.senderId, super.imageLoader); super.messagesAdapter.enableSelectionMode(this); super.messagesAdapter.setLoadMoreListener(this); + super.messagesAdapter.registerViewClickListener(R.id.messageUserAvatar, + (view, message) -> AppUtils.showToast(DefaultMessagesActivity.this, + message.getUser().getName() + " avatar click", + false)); this.messagesList.setAdapter(super.messagesAdapter); } + + @Override + public void onStartTyping() { + Log.v("Typing listener", getString(R.string.start_typing_status)); + } + + @Override + public void onStopTyping() { + Log.v("Typing listener", getString(R.string.stop_typing_status)); + } } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledDialogsActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledDialogsActivity.java index 1d8d2865..eb0acc9d 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledDialogsActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledDialogsActivity.java @@ -28,7 +28,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_styled_dialogs); - dialogsList = (DialogsList) findViewById(R.id.dialogsList); + dialogsList = findViewById(R.id.dialogsList); initAdapter(); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledMessagesActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledMessagesActivity.java index ba01566a..e97ecec0 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledMessagesActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/demo/styled/StyledMessagesActivity.java @@ -30,10 +30,10 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_styled_messages); - messagesList = (MessagesList) findViewById(R.id.messagesList); + messagesList = findViewById(R.id.messagesList); initAdapter(); - MessageInput input = (MessageInput) findViewById(R.id.input); + MessageInput input = findViewById(R.id.input); input.setInputListener(this); input.setAttachmentsListener(this); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/MainActivity.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/MainActivity.java index 8a49e160..b05896ce 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/MainActivity.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/MainActivity.java @@ -1,8 +1,9 @@ package com.stfalcon.chatkit.sample.features.main; import android.os.Bundle; -import android.support.v4.view.ViewPager; -import android.support.v7.app.AppCompatActivity; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager.widget.ViewPager; import com.stfalcon.chatkit.sample.R; import com.stfalcon.chatkit.sample.features.demo.custom.holder.CustomHolderDialogsActivity; @@ -26,12 +27,12 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - ViewPager pager = (ViewPager) findViewById(R.id.pager); + ViewPager pager = findViewById(R.id.pager); pager.setAdapter(new MainActivityPagerAdapter(this, getSupportFragmentManager())); pager.setPageMargin((int) getResources().getDimension(R.dimen.card_padding) / 4); pager.setOffscreenPageLimit(3); - CircleIndicator indicator = (CircleIndicator) findViewById(R.id.indicator); + CircleIndicator indicator = findViewById(R.id.indicator); indicator.setViewPager(pager); } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/DemoCardFragment.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/DemoCardFragment.java index 8d4054fd..c8779198 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/DemoCardFragment.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/DemoCardFragment.java @@ -2,13 +2,14 @@ import android.content.Context; import android.os.Bundle; -import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.TextView; +import androidx.fragment.app.Fragment; + import com.stfalcon.chatkit.sample.R; /* @@ -54,9 +55,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_demo_card, container, false); - TextView tvTitle = (TextView) v.findViewById(R.id.tvTitle); - TextView tvDescription = (TextView) v.findViewById(R.id.tvDescription); - Button button = (Button) v.findViewById(R.id.button); + TextView tvTitle = v.findViewById(R.id.tvTitle); + TextView tvDescription = v.findViewById(R.id.tvDescription); + Button button = v.findViewById(R.id.button); tvTitle.setText(title); tvDescription.setText(description); @@ -67,10 +68,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onClick(View view) { - switch (view.getId()) { - case R.id.button: - onAction(); - break; + if (view.getId() == R.id.button) { + onAction(); } } diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/MainActivityPagerAdapter.java b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/MainActivityPagerAdapter.java index bfab5867..09f9d842 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/MainActivityPagerAdapter.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/features/main/adapter/MainActivityPagerAdapter.java @@ -1,9 +1,10 @@ package com.stfalcon.chatkit.sample.features.main.adapter; import android.content.Context; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; import com.stfalcon.chatkit.sample.R; @@ -18,10 +19,10 @@ public class MainActivityPagerAdapter extends FragmentStatePagerAdapter { public static final int ID_CUSTOM_VIEW_HOLDER = 3; public static final int ID_CUSTOM_CONTENT = 4; - private Context context; + private final Context context; public MainActivityPagerAdapter(Context context, FragmentManager fm) { - super(fm); + super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); this.context = context; } @@ -58,4 +59,4 @@ public Fragment getItem(int position) { public int getCount() { return 5; } -} \ No newline at end of file +} diff --git a/sample/src/main/java/com/stfalcon/chatkit/sample/utils/AppUtils.java b/sample/src/main/java/com/stfalcon/chatkit/sample/utils/AppUtils.java index 8c914dfd..ca49edef 100644 --- a/sample/src/main/java/com/stfalcon/chatkit/sample/utils/AppUtils.java +++ b/sample/src/main/java/com/stfalcon/chatkit/sample/utils/AppUtils.java @@ -1,9 +1,10 @@ package com.stfalcon.chatkit.sample.utils; import android.content.Context; -import android.support.annotation.StringRes; import android.widget.Toast; +import androidx.annotation.StringRes; + /* * Created by troy379 on 04.04.17. */ diff --git a/sample/src/main/res/drawable/dark_blue_top_gradient.xml b/sample/src/main/res/drawable/dark_blue_top_gradient.xml index fbfded4c..06162093 100644 --- a/sample/src/main/res/drawable/dark_blue_top_gradient.xml +++ b/sample/src/main/res/drawable/dark_blue_top_gradient.xml @@ -1,9 +1,9 @@ + android:shape="rectangle"> + android:startColor="@color/cornflower_blue_darkest" /> \ No newline at end of file diff --git a/sample/src/main/res/drawable/ic_play_black.xml b/sample/src/main/res/drawable/ic_play_black.xml index fd5de4d8..1a348327 100644 --- a/sample/src/main/res/drawable/ic_play_black.xml +++ b/sample/src/main/res/drawable/ic_play_black.xml @@ -1,5 +1,4 @@ - + android:pathData="M3,1.5v14l11,-7z" /> diff --git a/sample/src/main/res/drawable/ic_play_white.xml b/sample/src/main/res/drawable/ic_play_white.xml index cf96f070..4196f11a 100644 --- a/sample/src/main/res/drawable/ic_play_white.xml +++ b/sample/src/main/res/drawable/ic_play_white.xml @@ -1,5 +1,4 @@ - + android:pathData="M3,1.5v14l11,-7z" /> diff --git a/sample/src/main/res/drawable/shape_bubble_offline.xml b/sample/src/main/res/drawable/shape_bubble_offline.xml index d1cc3c34..219d82d1 100644 --- a/sample/src/main/res/drawable/shape_bubble_offline.xml +++ b/sample/src/main/res/drawable/shape_bubble_offline.xml @@ -1,13 +1,13 @@ + android:shape="oval"> - + + android:color="@color/white" /> + android:height="20dp" /> \ No newline at end of file diff --git a/sample/src/main/res/drawable/shape_bubble_online.xml b/sample/src/main/res/drawable/shape_bubble_online.xml index 9b1bbe94..2b5f2386 100644 --- a/sample/src/main/res/drawable/shape_bubble_online.xml +++ b/sample/src/main/res/drawable/shape_bubble_online.xml @@ -1,13 +1,13 @@ + android:shape="oval"> - + + android:color="@color/white" /> + android:height="20dp" /> \ No newline at end of file diff --git a/sample/src/main/res/drawable/shape_custom_cursor.xml b/sample/src/main/res/drawable/shape_custom_cursor.xml new file mode 100644 index 00000000..ece0b260 --- /dev/null +++ b/sample/src/main/res/drawable/shape_custom_cursor.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_custom_holder_dialogs.xml b/sample/src/main/res/layout/activity_custom_holder_dialogs.xml index 81eb8ecd..0359eb85 100644 --- a/sample/src/main/res/layout/activity_custom_holder_dialogs.xml +++ b/sample/src/main/res/layout/activity_custom_holder_dialogs.xml @@ -1,5 +1,4 @@ - + app:dialogUnreadTitleTextStyle="bold" /> diff --git a/sample/src/main/res/layout/activity_custom_holder_messages.xml b/sample/src/main/res/layout/activity_custom_holder_messages.xml index 88c6d1cc..723bca6c 100644 --- a/sample/src/main/res/layout/activity_custom_holder_messages.xml +++ b/sample/src/main/res/layout/activity_custom_holder_messages.xml @@ -1,5 +1,4 @@ - + app:outcomingTimeTextColor="@color/gray_dark_transparent" /> + android:background="@color/gray_light" /> + app:showAttachmentButton="true" /> \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_custom_layout_dialogs.xml b/sample/src/main/res/layout/activity_custom_layout_dialogs.xml index 81eb8ecd..0359eb85 100644 --- a/sample/src/main/res/layout/activity_custom_layout_dialogs.xml +++ b/sample/src/main/res/layout/activity_custom_layout_dialogs.xml @@ -1,5 +1,4 @@ - + app:dialogUnreadTitleTextStyle="bold" /> diff --git a/sample/src/main/res/layout/activity_custom_layout_messages.xml b/sample/src/main/res/layout/activity_custom_layout_messages.xml index 88c6d1cc..723bca6c 100644 --- a/sample/src/main/res/layout/activity_custom_layout_messages.xml +++ b/sample/src/main/res/layout/activity_custom_layout_messages.xml @@ -1,5 +1,4 @@ - + app:outcomingTimeTextColor="@color/gray_dark_transparent" /> + android:background="@color/gray_light" /> + app:showAttachmentButton="true" /> \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_custom_media_messages.xml b/sample/src/main/res/layout/activity_custom_media_messages.xml index 9ce4da57..85e7db97 100644 --- a/sample/src/main/res/layout/activity_custom_media_messages.xml +++ b/sample/src/main/res/layout/activity_custom_media_messages.xml @@ -1,5 +1,4 @@ - + android:layout_above="@+id/input" /> + android:background="@color/gray_light" /> + app:showAttachmentButton="true" /> \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_default_dialogs.xml b/sample/src/main/res/layout/activity_default_dialogs.xml index bb5e9436..a14ac43c 100644 --- a/sample/src/main/res/layout/activity_default_dialogs.xml +++ b/sample/src/main/res/layout/activity_default_dialogs.xml @@ -1,5 +1,4 @@ - @@ -7,6 +6,6 @@ + android:layout_height="match_parent" /> diff --git a/sample/src/main/res/layout/activity_default_messages.xml b/sample/src/main/res/layout/activity_default_messages.xml index 9ce4da57..85e7db97 100644 --- a/sample/src/main/res/layout/activity_default_messages.xml +++ b/sample/src/main/res/layout/activity_default_messages.xml @@ -1,5 +1,4 @@ - + android:layout_above="@+id/input" /> + android:background="@color/gray_light" /> + app:showAttachmentButton="true" /> \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_main.xml b/sample/src/main/res/layout/activity_main.xml index a831f0b8..a84a40bf 100644 --- a/sample/src/main/res/layout/activity_main.xml +++ b/sample/src/main/res/layout/activity_main.xml @@ -1,5 +1,4 @@ - @@ -8,7 +7,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/dark_blue_top_gradient" - android:fitsSystemWindows="true"/> + android:fitsSystemWindows="true" /> + android:textSize="28sp" /> - + android:paddingRight="@dimen/card_padding" + android:paddingBottom="20dp" /> + android:layout_alignParentBottom="true" /> - \ No newline at end of file + \ No newline at end of file diff --git a/sample/src/main/res/layout/activity_styled_dialogs.xml b/sample/src/main/res/layout/activity_styled_dialogs.xml index 81eb8ecd..0359eb85 100644 --- a/sample/src/main/res/layout/activity_styled_dialogs.xml +++ b/sample/src/main/res/layout/activity_styled_dialogs.xml @@ -1,5 +1,4 @@ - + app:dialogUnreadTitleTextStyle="bold" /> diff --git a/sample/src/main/res/layout/activity_styled_messages.xml b/sample/src/main/res/layout/activity_styled_messages.xml index 57d47dd8..9e2111d2 100644 --- a/sample/src/main/res/layout/activity_styled_messages.xml +++ b/sample/src/main/res/layout/activity_styled_messages.xml @@ -1,5 +1,4 @@ - + app:textAutoLink="all" /> + android:background="@color/gray_light" /> + app:showAttachmentButton="true" /> \ No newline at end of file diff --git a/sample/src/main/res/layout/fragment_demo_card.xml b/sample/src/main/res/layout/fragment_demo_card.xml index 87290af0..11841c1a 100644 --- a/sample/src/main/res/layout/fragment_demo_card.xml +++ b/sample/src/main/res/layout/fragment_demo_card.xml @@ -1,5 +1,4 @@ - + android:textSize="22sp" /> + android:textSize="15sp" />