02-09-2021, 10:29 AM (Última modificación: 02-09-2021, 10:51 AM por Grouxho.)
Si no me equivoco estás en android Q no?.
En android R (adjunto imagen) la cosa se complica aún más. Ahora en vez de una notificación es un Bar Item.
En tu caso, y en R también, el layout también depende de la app, es una custom view, y en realidad creo que se procesan en ui como remote views, no estoy seguro, ya lo miraré. Pero veo que tienes acceso a ello.
Bien, para lo que quieres hacer dos ideas:
- Si usas getrunningtask para saber cual es la aplicación que está ahora mismo siendo vista por el usuario te pasa lo que comentas. Lo que debes averiguar es qué aplicación tiene capturado el MediaFocus, eso se puede intentar hacer vía el media controller, por ejemplo, o con callbacks del media session. Deberás investigar un poco, pero esa es la forma correcta. Yo esto lo usaba para hacer el mod de album art hace un par de versiones android o ya más, no recuerdo. Si retomo esa idea lo comento por aquí, pero por ahora ando en otros mods para android R.
- Para el tema de los colores de los botones una idea sería pillar la view, ir buscando childs y entonces comprobar si son "instance of buttons" (digo buttons porque tampoco he mirado el layout y no se si son imageviews o buttons.. La lógica sería, si el child es del tipo que buscamos, lo coloreamos. Y así con cada child.
El problema que veo a este mod es que la notificación de media se actualiza varias veces por segundo, y claro, procesar todo lo que estás procesando gastará mucha batería. Como siempre hago en mis mods te aconsejo que uses un mecanismo asíncrono para saber que app ha capturado el media focuss y cada vez que cambie pues averiguas la app y te lo guardas por ahí. y si quieres colorear por app, pues en ese mismo momento guardas el color que le corresponde. Así en cada actualización de la media notification ya tienes el color a aplicar y reduces mucho el procesamiento.
Son solo ideas, no he tenido tiempo de mirar el código en detalle, pero dale un vistazo, me alegra ver que alguien intenta este tipo de mods..
Yo precisamente estoy también liado con los colorines del panel para android R, pero yo desde el principio ya descarto la idea de colorear las notificaciones o panel bars que usan custom layouts (layouts de aplicaciones, remote views. Por ejemplo la noti de google de noticias de actualidad, etc.). No me motiva meter ciclos de cpu solo para esos temas puntuales.
Sent from my SM-G986B using Tapatalk
Responder
Recuento: 2 usuarios dicen Me Gusta a Grouxho por este post:2 usuarios dicen Gracias a Grouxho por este post • JavixKGD (02-10-2021), GVM (02-09-2021)
(02-09-2021, 10:29 AM)Grouxho escribió: Si no me equivoco estás en android Q no?.
En android R (adjunto imagen) la cosa se complica aún más. Ahora en vez de una notificación es un Bar Item.
En tu caso, y en R también, el layout también depende de la app, es una custom view, y en realidad creo que se procesan en ui como remote views, no estoy seguro, ya lo miraré. Pero veo que tienes acceso a ello.
Bien, para lo que quieres hacer dos ideas:
- Si usas getrunningtask para saber cual es la aplicación que está ahora mismo siendo vista por el usuario te pasa lo que comentas. Lo que debes averiguar es qué aplicación tiene capturado el MediaFocus, eso se puede intentar hacer vía el media controller, por ejemplo, o con callbacks del media session. Deberás investigar un poco, pero esa es la forma correcta. Yo esto lo usaba para hacer el mod de album art hace un par de versiones android o ya más, no recuerdo. Si retomo esa idea lo comento por aquí, pero por ahora ando en otros mods para android R.
- Para el tema de los colores de los botones una idea sería pillar la view, ir buscando childs y entonces comprobar si son "instance of buttons" (digo buttons porque tampoco he mirado el layout y no se si son imageviews o buttons.. La lógica sería, si el child es del tipo que buscamos, lo coloreamos. Y así con cada child.
El problema que veo a este mod es que la notificación de media se actualiza varias veces por segundo, y claro, procesar todo lo que estás procesando gastará mucha batería. Como siempre hago en mis mods te aconsejo que uses un mecanismo asíncrono para saber que app ha capturado el media focuss y cada vez que cambie pues averiguas la app y te lo guardas por ahí. y si quieres colorear por app, pues en ese mismo momento guardas el color que le corresponde. Así en cada actualización de la media notification ya tienes el color a aplicar y reduces mucho el procesamiento.
Son solo ideas, no he tenido tiempo de mirar el código en detalle, pero dale un vistazo, me alegra ver que alguien intenta este tipo de mods..
Yo precisamente estoy también liado con los colorines del panel para android R, pero yo desde el principio ya descarto la idea de colorear las notificaciones o panel bars que usan custom layouts (layouts de aplicaciones, remote views. Por ejemplo la noti de google de noticias de actualidad, etc.). No me motiva meter ciclos de cpu solo para esos temas puntuales.
Estas correcto en todos los accounts, esto es un remote view, pero no fue asi como lo llame sino que use un check-cast de FrameLayout desde el layout en el framework que contiene los botones (ImageButtons) y usando el FrameLayout luego busque los botones por sus IDs. Utilize el MediaController como sugerido y "EUREKAAA!!" ahi encontre "getPackageName()Ljava/lang/String;" y efectivamente llama a los paquetes de media que estan activos. Esto ahora me abre la puerta tambien para cambiarle los iconos de media dependiendo del layout, por lo menos los de play, pausa, prev y next. Mecionastes usar un mecanismo asíncrono. Puedes elaborar un poco mas en como se veria esto? En mi metodo, solo hago el llamado an los colores de apps individuales cuando tenemos todos las acciones disponibles, si no se revierte a 3 iconos coloreados cual es el basico de todo los apps en compacto. Para decirte la verdad he estado pensando como bajar el numero de metodos que utilice para esto ya que tengo 5 metodos individuales coloreando en diferentes situaciones. Te puedo enviar el smali para que lo verifiques? Maybe hay una mejor manera de poder hacer el mod? Verdaderamente agradecido con toda la ayuda.
Responder
Recuento: 1 usuario dice Me Gusta a JavixKGD por este post:1 usuario dice Gracias a JavixKGD por este post • Grouxho (02-09-2021)
02-09-2021, 07:24 PM (Última modificación: 02-09-2021, 07:29 PM por Grouxho.)
(02-09-2021, 07:00 PM)JavixKGD escribió:
(02-09-2021, 10:29 AM)Grouxho escribió: Si no me equivoco estás en android Q no?.
En android R (adjunto imagen) la cosa se complica aún más. Ahora en vez de una notificación es un Bar Item.
En tu caso, y en R también, el layout también depende de la app, es una custom view, y en realidad creo que se procesan en ui como remote views, no estoy seguro, ya lo miraré. Pero veo que tienes acceso a ello.
Bien, para lo que quieres hacer dos ideas:
- Si usas getrunningtask para saber cual es la aplicación que está ahora mismo siendo vista por el usuario te pasa lo que comentas. Lo que debes averiguar es qué aplicación tiene capturado el MediaFocus, eso se puede intentar hacer vía el media controller, por ejemplo, o con callbacks del media session. Deberás investigar un poco, pero esa es la forma correcta. Yo esto lo usaba para hacer el mod de album art hace un par de versiones android o ya más, no recuerdo. Si retomo esa idea lo comento por aquí, pero por ahora ando en otros mods para android R.
- Para el tema de los colores de los botones una idea sería pillar la view, ir buscando childs y entonces comprobar si son "instance of buttons" (digo buttons porque tampoco he mirado el layout y no se si son imageviews o buttons.. La lógica sería, si el child es del tipo que buscamos, lo coloreamos. Y así con cada child.
El problema que veo a este mod es que la notificación de media se actualiza varias veces por segundo, y claro, procesar todo lo que estás procesando gastará mucha batería. Como siempre hago en mis mods te aconsejo que uses un mecanismo asíncrono para saber que app ha capturado el media focuss y cada vez que cambie pues averiguas la app y te lo guardas por ahí. y si quieres colorear por app, pues en ese mismo momento guardas el color que le corresponde. Así en cada actualización de la media notification ya tienes el color a aplicar y reduces mucho el procesamiento.
Son solo ideas, no he tenido tiempo de mirar el código en detalle, pero dale un vistazo, me alegra ver que alguien intenta este tipo de mods..
Yo precisamente estoy también liado con los colorines del panel para android R, pero yo desde el principio ya descarto la idea de colorear las notificaciones o panel bars que usan custom layouts (layouts de aplicaciones, remote views. Por ejemplo la noti de google de noticias de actualidad, etc.). No me motiva meter ciclos de cpu solo para esos temas puntuales.
Estas correcto en todos los accounts, esto es un remote view, pero no fue asi como lo llame sino que use un check-cast de FrameLayout desde el layout en el framework que contiene los botones (ImageButtons) y usando el FrameLayout luego busque los botones por sus IDs. Utilize el MediaController como sugerido y "EUREKAAA!!" ahi encontre "getPackageName()Ljava/lang/String;" y efectivamente llama a los paquetes de media que estan activos. Esto ahora me abre la puerta tambien para cambiarle los iconos de media dependiendo del layout, por lo menos los de play, pausa, prev y next. Mecionastes usar un mecanismo asíncrono. Puedes elaborar un poco mas en como se veria esto? En mi metodo, solo hago el llamado an los colores de apps individuales cuando tenemos todos las acciones disponibles, si no se revierte a 3 iconos coloreados cual es el basico de todo los apps en compacto. Para decirte la verdad he estado pensando como bajar el numero de metodos que utilice para esto ya que tengo 5 metodos individuales coloreando en diferentes situaciones. Te puedo enviar el smali para que lo verifiques? Maybe hay una mejor manera de poder hacer el mod? Verdaderamente agradecido con toda la ayuda.
Si, claro, mándamelos, sin problemas.
Por asíncrono me refiero a no comprobar continuamente qué color aplicar, o que app es la que está con el foco. A que que cuando pilles el nombre de la apk que tiene el focus media lo guardes en una variable public static como suelo hacer yo para que sea accesible desde cualquier punto dentro del mismo context.
Por ejemplo, y sin haber visto el código. Supongo que estás mirando en NotificationMediaManager, que ahí verás que se accede al packagename en el método findAndUpdateMediaNotifications. Pues bien, después de ese getpackagename, podrías llamar a un método que compruebe si el packagename actual (el que consigues después del getpackagename) es igual al último packagename. Si es igual, no haces nada, si no es igual, actualizas los colores o el color y lo almacenas en una variable public static. De esta forma tendrás siempre a mano el valor del package name y del color. Si el user cambia el valor de la preferencia de color para una apk, tu actualizas el color de esa variable. la próxima vez que quieras colorear no tienes nada más que pillar el color, nada de comprobar más cosas (bueno, sólo comprobar si el mod está activado, etc.)
De esta forma no tienes que estar calculando siempre qué color corresponde. En este caso veo que NotificationMediaManager te hace la parte de conseguir el nombre de la aplicación, así es que lo tienes bastante bien encaminado.
Aprovecho por si tienes algún mod que necesites saber qué app es la que está visible en cualquier momento de forma asíncrona. En services en PhoneWindowManagerExt tienes el método updateTopActivity(Landroid/content/ComponentName;)V que es llamado cada vez que cambia la top activity (la visible).
En systemui también es posible, hazte un TaskStackChangeListener y regístralo en el ActivityManagerWrapper, que te llamará cada vez que cambie... :)
Una cosa más: cuando no sabes los ids que podría tener los botones lo mejor es usar el instance-of-ImageButtons , si lo es - > coloreas, si no lo es o es null , no coloreas.
Responder
Recuento: 1 usuario dice Me Gusta a Grouxho por este post:1 usuario dice Gracias a Grouxho por este post • JavixKGD (02-10-2021)
Añadi el smali en donde use los mods de los colores para los botones. Los puedes encontrar con facilidad usando tu mismo mecanismo de los guides con los ####. Hay otros mods mas en el smali, maybe les puedas hechar un vistazo a esos tambien. Quisiera aprender a como hacer mis metodos mas compactos o maybe mas utiles en acuerdo a los rescursos que utilizo de mi telefono ya sea memoria o bateria. Por favor no me juzgues en mi codigo, es bien beginner Estoy tratando de mejorarlo y seguir modificando como modifico y hago mods nuevos.
Por cierto, el MediaController lo estoy sacando de otra clase en modo estatico, de NotificationMediaManager. Iba a tratar de añadirlo a la misma clase, pero no sabia como hacer el media token que se necesita para el instance the MediaController en el constructor. Maybe me puedas ayudar con eso tambien si tengas la oportunidad.
Ah last thing, sabes de algun metodo de back to kill que funcione? Estaba usando este run()V en PhoneWindowManager$KillApp despues de haber dado instance a la clase desde PhoneWindowManager. Este es el metodo:
######Creo que mi problema esta aqui ya que no puedo entontrar el metodo correcto para esto. Era otro anteriormente que era solo RemoveTask(II)Z en ActivityManager me parece, pero este no existe ahi ya. Sabes donde se encuentra en Q?
Añadi el smali en donde use los mods de los colores para los botones. Los puedes encontrar con facilidad usando tu mismo mecanismo de los guides con los ####. Hay otros mods mas en el smali, maybe les puedas hechar un vistazo a esos tambien. Quisiera aprender a como hacer mis metodos mas compactos o maybe mas utiles en acuerdo a los rescursos que utilizo de mi telefono ya sea memoria o bateria. Por favor no me juzgues en mi codigo, es bien beginner Estoy tratando de mejorarlo y seguir modificando como modifico y hago mods nuevos.
Por cierto, el MediaController lo estoy sacando de otra clase en modo estatico, de NotificationMediaManager. Iba a tratar de añadirlo a la misma clase, pero no sabia como hacer el media token que se necesita para el instance the MediaController en el constructor. Maybe me puedas ayudar con eso tambien si tengas la oportunidad.
Ah last thing, sabes de algun metodo de back to kill que funcione? Estaba usando este run()V en PhoneWindowManager$KillApp despues de haber dado instance a la clase desde PhoneWindowManager. Este es el metodo:
######Creo que mi problema esta aqui ya que no puedo entontrar el metodo correcto para esto. Era otro anteriormente que era solo RemoveTask(II)Z en ActivityManager me parece, pero este no existe ahi ya. Sabes donde se encuentra en Q?
He echado un vistazo a tu código. Estas usando el enfoque tradicional que se impuso en este mundillo y que bueno, ya irás cambiando de estilo, lo verás.
Te voy a dar mi opinión y sobre todo algunas ideas para que sigas indagando en esto y veas otros enfoques que te puedan ayudar, espero.
- Si no estoy equivocado, y dando un primer vistazo al código de samsung, NotificationTemplateViewWrapper es una clase que se instancia a menudo, con cada notificación. No solo para notificaciones tipo media sino para todas.
- En el caso de notificaciones media el contenido cambia muy a menudo, lógicamente.
Teniendo en cuenta estas dos cuestiones veamos tu código. Cada vez que se instancia el wrapper (NotificationTemplateViewWrapper) resulta que registras el gearobserver con más de 20 claves...y lees las preferencias y las almacenas en unos static dentro del objeto wrapper.
Cada vez que una notificación, media o no, actualiza el contenido, actualizas todos las referencias a botones, vuelves a comprobar todos los colores (setHeaderValues()V). También cuando se llama al updatependingcancelations y otros momentos.
Mi consejo es que:
- Te crees una clase public donde quieras donde guardes los valores static con los valores.
- En esa clase añades un observer, usas el mismo context que statusbar para registrar todas tus claves. Cuando haya un cambio guardas los valores de usuario en esas static comentadas.
- Usa el mismo context que la clase statusbar, pues así te aseguras que desde el wrapper los valores serán los correctos.
Si haces esto, te habrás ahorrado un montón de ciclos de cpu y desde NotificationTemplateWrapper sólo tienes que usar sget, etc, pero tomas los valores de la clase creada. En cualquiera de mis mods ves cómo va.
Para hacerlo onfly, en mis guías verás como puedes acceder a statusbar desde esa clase a través de SystemUiprovider (en Q, en R es con Dependency) y una vez en statusbar pues o fuerzas una llamada a cambio de density o lo que sea. En mis mods verás cómo
Respecto a saber la app que tiene el focus, efectivamente en NotificationMediaManager lo puedes obtener, ahí mismo puedes poner una instrucción para guardar el packagename en la clase que te digo y además
puedes en ese momento comprobar qué apk está en curso y actualizar los colores en las claves static. Así sigues teniendo siempre disponible y actualizado los valores de las preferencias.
finalmente si estás empezando, te aconsejo que vayas abandonando gearobserver (vale para algún mod, pero usarlo así de forma generalizada en cualquier caso como ves no es a veces buena idea) y uses GrxSettings como app de preferencias, es otra liga.
Respecto al kill, echando un vistazo rápido al tema, creo que necesitas eto
Recuento: 3 usuarios dicen Me Gusta a Grouxho por este post:3 usuarios dicen Gracias a Grouxho por este post • JavixKGD (02-11-2021), necrosauron (02-11-2021), GVM (02-11-2021)
Muchisimas gracias por todo, eres un maestro literal de modding. Gracias por sacar de tu tiempo para no tan solo hacer guias para los mods pero enseñar a la comunidad. Ya te dejo saber como me va. Voy a tomar tu sugerencia y poner los valores staticos en una clase aparte con el observer aparte. Ahora bien, mi ultima pregunta, si hago una clase aparte, tiene que ser una clase aparte por cada mod? Por ejemplo este mod de los botones, hago una clase solamente para los botones o crees que pueda incluir todos los mods que tengo en la clase NotificationTemplateViewWrapper y hacer los llamados desde esa clase que voy a crear?
Responder
Recuento: 2 usuarios dicen Me Gusta a JavixKGD por este post:2 usuarios dicen Gracias a JavixKGD por este post • Grouxho (02-11-2021), GVM (02-11-2021)
(02-11-2021, 06:49 PM)JavixKGD escribió: Muchisimas gracias por todo, eres un maestro literal de modding. Gracias por sacar de tu tiempo para no tan solo hacer guias para los mods pero enseñar a la comunidad. Ya te dejo saber como me va. Voy a tomar tu sugerencia y poner los valores staticos en una clase aparte con el observer aparte. Ahora bien, mi ultima pregunta, si hago una clase aparte, tiene que ser una clase aparte por cada mod? Por ejemplo este mod de los botones, hago una clase solamente para los botones o crees que pueda incluir todos los mods que tengo en la clase NotificationTemplateViewWrapper y hacer los llamados desde esa clase que voy a crear?
Pues eso depende de ti. Yo para las guías hago una por mod, porque sería un lio si no. Pero si es para tu rom o para ti hazte las clases que necesites por separado, o junta la lógica en una y deja los valores en otra u otras. Lo importante es que entiendas que con el mecanismo de claves public static obtendrás los valores correctos si estás en el mismo context y en el caso del systemui en el 90% de los casos te vale el context de la clase statusbar.
Puedes hacerte tantas clases como te sea más cómodo. Por ejemplo, puedes ir metiendo toda la lógica en una y luego hacer otras más pequeñas con solamente los valores de cada mod, etc.