APDE GSoC ’18: Android Mode 4.0 Integrations

Când rulați o schiță cu ținta watch face, schița se construiește și este trimisă la ceas. Apoi, aplicația APDE wear companion app încarcă automat schița și lansează selectorul de fețe de ceas:

Schițele VR sunt instalate la fel ca aplicațiile obișnuite. Ele sunt compatibile cu platforma VR de la Google, care include căștile Cardboard și Daydream:

Dacă doriți să puneți mâna pe aceste noi caracteristici, vă rugăm să vă alăturați canalului de previzualizare APDE și să urmați instrucțiunile din partea de sus pentru a vă alătura listei de testeri.

În momentul redactării, v0.5.0-pre2 este disponibilă și include imagini de fundal și VR, dar nu și fețe de ceas.

Cum funcționează toate acestea?

Cheia pentru a susține aceste noi obiective a fost actualizarea pentru a utiliza modul Android Mode 4.0 al desktop Processing, care a adăugat suport pentru imagini de fundal, fețe de ceas și VR. Munca mea a fost doar portarea acestor caracteristici noi și interesante pe APDE, ceea ce nu a fost în sine o sarcină ușoară.

Am decis de la început că vreau ca fiecare schiță să poată fi rulată pentru fiecare țintă. Vreau ca utilizatorii să poată lua orice schiță sau exemplu și să îl transplanteze fără probleme dintr-un mediu în oricare altul, fie că este vorba de o aplicație, un wallpaper, un watchface sau VR. În acest fel, există o flexibilitate și o capacitate maximă de explorare a întregului potențial al schițelor Processing. Singura excepție de la această regulă este că schițele VR trebuie să fie 3D (schițele 2D pur și simplu nu funcționează din cauza naturii VR).

Această abordare diferă de cea a modului Android. De exemplu, pe desktop, VR este împachetat ca o bibliotecă, astfel încât numai schițele care importă în mod explicit biblioteca VR pot fi rulate pentru ținta VR. În APDE, fiecare schiță 3D poate fi rulată pentru VR, iar importurile corecte sunt adăugate automat.

Sistemul de construcție utilizează acum un set de șabloane pentru a ține evidența tuturor fișierelor de construcție, cum ar fi activitățile, manifestele și layout-urile. Această metodă este mult mai preferabilă față de codificarea hard-coding care se făcea înainte. Șabloanele sunt preluate aproape textual din modul Android, dar există câteva modificări, cum ar fi suportul pentru căștile Daydream VR.

Papierele de fundal live și schițele VR sunt instalate la fel ca și schițele aplicațiilor obișnuite, dar VR necesită bibliotecile Google VR. În mod similar, fețele de ceas necesită biblioteca de suport pentru dispozitive portabile, dar nu se instalează în același mod, deoarece trebuie să fie instalate pe un ceas.

Watch Face Woes

Am avut nevoie să instalez schița pe ceas.

Primul lucru pe care l-am încercat a fost să împing schița pe ceas și să o instalez acolo. Se pare că încărcarea laterală a unui APK pe un ceas Wear OS (fostul Android Wear) nu este atât de ușoară pe cât pare. Pe un telefon Android, trebuie doar să activați instalarea din surse necunoscute în setări și sunteți gata. Pe Wear, însă, această instalare este blocată de sistem și nu există nicio modalitate de a ocoli acest lucru fără a roota fie telefonul, fie ceasul sau fără a conecta ceasul la un computer. Niciuna dintre aceste opțiuni nu reprezintă opțiuni pentru un mediu de dezvoltare mobilă entry-level.

În continuare, am încercat să împachetez aplicația ca o aplicație Wear 1.x și să o instalez pe telefon. Înainte de Android Wear 2.0, toate aplicațiile Wear au fost distribuite fiind incluse în aplicații de telefon, chiar dacă acea aplicație de telefon era doar o coajă goală. Toate acestea s-au schimbat în 2.0, când aplicațiile Wear au devenit independente. Speranța era că aș putea profita de vechiul sistem pentru a instala aplicația ceasului prin intermediul telefonului, dar acest lucru a fost fără succes. Încă nu știu dacă vechea metodă de instalare este sau nu acceptată pe ceasurile mai noi, dar nu am reușit să fac să funcționeze o dovadă de concept.

În cele din urmă am recurs la o metodă de ultimă instanță: încărcarea claselor, care este un fel de magie neagră. Ideea este că, în loc să instalez schița ca o aplicație independentă, pot încărca clasa schiței într-o aplicație care rulează deja pe ceas, eliminând necesitatea de a instala schița de fiecare dată când aceasta este rulată. Acesta este un model fundamental diferit de modul în care funcționează în prezent APDE. APDE construiește o schiță și aceasta este o aplicație de sine stătătoare care se instalează. Ecranul aplicației acumulează o grămadă de schițe pe măsură ce utilizatorul le rulează, iar acestea rămân acolo atunci când APDE este dezinstalat. Ceasul este diferit. Acum, schițele nu sunt instalate, ci doar încărcate. Există întotdeauna o singură schiță disponibilă ca față de ceas, iar aceasta dispare atunci când APDE este dezinstalat.

Se pare că această abordare funcționează. Utilizatorul instalează o aplicație punte pe ceasul său din Play Store (nu este încă disponibilă) numită „APDE Wear Companion”. Când APDE construiește o schiță, o trimite către companionul de uzură. Companionul de purtare despachetează schița și solicită utilizatorului să selecteze o față de ceas încorporată în companionul de purtare. Apoi, acel chip de ceas încarcă schița și o afișează. Acest lucru este surprinzător de transparent.

Au existat câteva provocări.

Când schița se blochează, aceasta rulează în wear companion, astfel încât întreaga aplicație wear companion se blochează, de asemenea. În prezent, încerc să limitez pagubele, dar uneori companionul de uzură se rupe și trebuie repornit pentru că schița s-a blocat de prea multe ori. De asemenea, APDE nu poate vedea în acest moment urmele de stivă de la fețele de ceas care se prăbușesc, deoarece procesul moare înainte ca urma de stivă să poată fi trimisă. (Instrucțiunile de tipărire funcționează totuși.)

Nu există doar un singur chip de ceas; de fapt, există două. Processing are două clase de bază pentru watch faces: una pentru randarea implicită (JAVA2D) și una pentru randările bazate pe OpenGL (P2D și P3D). Astfel, există două fețe de ceas, una pentru fiecare randare. Atunci când companionul de uzură despachetează o schiță, acesta verifică ce randare folosește. Apoi, fața de ceas corespunzătoare este făcută vizibilă, iar cealaltă este ascunsă. Acesta este un alt tip de magie neagră, deoarece utilizatorul nici nu ar trebui să observe, dar pare să funcționeze destul de bine.

Am mințit. Sunt de fapt patru fețe de ceas. Se pare că atunci când se încarcă un nou cadran de ceas, dacă cel nou este același cu cel vechi (și toate schițele folosesc aceleași două cadrane de ceas), atunci sistemul „scurtcircuitează” (acesta este termenul tehnic) și nu reîncarcă cadranul de ceas. Acest lucru este foarte bine pentru fețele de ceas obișnuite, dar fața de ceas APDE trebuie să se reîncarce pentru a obține noua schiță. Soluția este murdară, dar eficientă: trebuie doar să aveți două fețe de ceas pentru fiecare randare (patru în total) și să alternați între ele la încărcarea noilor schițe, astfel încât fața de ceas să fie forțată să se reîncarce.

În ciuda tuturor acestor dificultăți, sunt fericit să spun că fețele de ceas par să funcționeze destul de bine, cel puțin pe cele două seturi de dispozitive pe care le-am testat. Celelalte ținte, mai probabil de utilizat – imagini de fundal și VR – au fost semnificativ mai ușor de implementat.

Lucrând în viitor

Următoarea caracteristică majoră planificată pentru această vară este un mod „previzualizare”. În prezent, schițele APDE trebuie să fie instalate de fiecare dată când sunt rulate. Acest aranjament nu este ideal, deoarece programul de instalare dublează timpul dintre apăsarea butonului „run” și vizualizarea schiței pe unele telefoane. De asemenea, așa cum s-a descris mai sus, toate schițele pot aglomera ecranul aplicației. Faptul că nu trebuie să instalați schițele este probabil cea mai solicitată caracteristică a APDE.

Am avut inițial două soluții propuse pentru această problemă. În primul rând, să folosiți Processing.js pentru a converti schița în JavaScript și să o rulați într-un WebView. În al doilea rând, profitați de Instant Apps pentru a rula o schiță fără a o instala. Ambele soluții sunt încă imperfecte. Processing.js este învechit și nu suportă niciun API nativ Android, cum ar fi accelerometrul. Instant Apps este, în cel mai bun caz, o idee șubredă, deoarece nici măcar nu știu dacă va fi posibil să păcălesc debuggerul pentru a găzdui local schițele și a le rula, sau dacă acest lucru ar fi mai rapid decât simpla instalare a acestora.

Din fericire, spargerea piuliței cu fața de ceas mi-a oferit o nouă abordare. APDE nu trebuie să convertească o schiță în JavaScript sau să construiască o aplicație instantanee. Trebuie doar să ia schița existentă și să o încarce cu clase în loc să o instaleze.

Cu această abordare, APDE trebuie doar să construiască resursele cu AAPT, să compileze clasele cu ECJ și să dexeze clasele. Pe telefonul meu, acest întreg proces durează mai puțin de două secunde (deși multe telefoane sunt considerabil mai lente), ceea ce reprezintă o îmbunătățire uriașă față de a trebui să construiască APK-ul și să îl instaleze.

Văzând și mai departe, intenționez să implementez compilarea incrementală în această vară, adică să fac compilatorul să ruleze în fundal pentru a afișa erorile în timp real. Cu acest sistem implementat, schița va fi probabil compilată chiar înainte ca utilizatorul să apese pe butonul de rulare, ceea ce înseamnă că tot ce rămâne este dexarea. Cu alte cuvinte, încărcătoare de clase ar putea, în mod conceptibil, să micșoreze procesul de compilare la mai puțin de o secundă, în funcție de hardware-ul telefonului, bineînțeles.

Multe emoții urmează să apară în această vară!

Fin

Dacă doriți să explorați mai în detaliu modificările pe care le-am făcut, consultați ramura android-mode-4 de pe GitHub. Am lăsat mesaje de confirmare detaliate (de cele mai multe ori) și tot codul se află acolo.

Rămâneți cu ochii în patru pentru modul de previzualizare!