Funktionen der SDK- und YotaPhone-Architektur



    Hallo habr So kam es, dass die Posts in unserem Blog im Grunde genommen für potenzielle Benutzer geschrieben wurden und nur an der Entwicklung von YotaPhone interessiert waren. Und für Softwareentwickler haben wir viel weniger Informationen veröffentlicht, die wir korrigieren möchten: Heute werden wir Ihnen die Funktionen zum Entwickeln von Anwendungen für YotaPhone und die dafür erstellten Tools erläutern.

    Entwicklertools


    Zunächst ein paar Worte zu den Entwicklungstools für YotaPhone. Sie müssen das Android SDK installieren , auf dem sich das YotaPhone SDK befindet. Ausführliche Installations- und Konfigurationsanweisungen für verschiedene Betriebssysteme finden Sie auf unserer Website für Entwickler .

    Wir haben versucht, das YotaPhone SDK für jeden Android-Entwickler so klar und praktisch wie möglich zu gestalten, damit die Terminologie und die interne Logik denen im Android SDK am nächsten kommen.

    Der zweite Bildschirm wird mit elektronischer Tinte erstellt und weist eine Reihe von Funktionen auf, die bei der Entwicklung von Anwendungen berücksichtigt werden müssen:
    • Der Farbraum besteht aus 16 Farben (Graustufen).
    • Lange Bildaktualisierungszeit
    • Ghosting-Effekt, der ursprünglich dieser Technologie innewohnt.
    • Keine Hintergrundbeleuchtung der Matrix

    Anwendungsarchitektur


    Machen Sie sich mit der akzeptierten Softwarearchitektur vertraut, bevor Sie mit der Entwicklung Ihrer ersten Anwendung für YotaPhone beginnen. Im Allgemeinen ähnelt es der traditionellen Android-Architektur:



    Interaktionsschema zwischen Architekturkomponenten:



    Ein paar Worte zu den einzelnen Komponenten des vorgestellten Schemas.
    • Anwendungsschicht. Dies ist die wichtigste Komponente für Drittentwickler, da die Installation ihrer Produkte nur innerhalb dieser Ebene möglich ist. Es funktioniert auf der gleichen Ebene wie Google-Anwendungen und -Dienste und enthält verschiedene zusätzliche Anwendungen wie Organizer, Editor, Hintergrundbild usw. Die Interaktion mit dem SDK erfolgt in beide Richtungen.
    • SDK. Diese Stufe ist für Anwendungen vorgesehen, die speziell für YotaPhone entwickelt wurden. Das SDK unterstützt eine Reihe von High-Level-Diensten für Front-End-Anwendungen in Form von Java-Klassen. Diese Dienste sind auch verfügbar, wenn Sie Anwendungen für die zweite Anzeige entwickeln. Das SDK enthält bidirektionale Schnittstellen zwischen Diensten und zusätzlichen Anwendungen.
    • YotaPhone Manager. Dies ist ein wichtiger Teil der Architektur. Diese Komponente steuert die Interaktion zwischen Anwendungen und einfachen Methoden. Alle Anwendungen von Drittanbietern interagieren mit dem SDK über den YotaPhone Manager.
    • YotaPhone Daemon. Dies ist eine einfache Softwarekomponente, die für die Übertragung von Befehlen von Anwendungen / Diensten über YotaPhone Manager an den E-Ink-Controller-Treiber verantwortlich ist.
    • Treiber für E-Ink-Controller. Es wurde vom Hersteller entwickelt und ist für die Ausführung von Befehlen verantwortlich, die von Anwendungen, Diensten oder dem Betriebssystem empfangen werden.
    • Android Framework. YotaPhone verwendet ein Standard-Android-Framework mit minimalen Änderungen.

    Das Schema der Arbeit mit dem zweiten Bildschirm


    Die BSActivity-Klasse (Back Screen Activity), die auf dem Standard- Android-Dienst basiert , ist für die Anzeige von Informationen auf dem zweiten YotaPhone-Display verantwortlich . Wenn Sie eine Anwendung für die zweite Anzeige entwickeln, müssen Sie Ihre eigene von BSActivity geerbte Klasse erstellen und in der Datei AndroidManifest.xml beschreiben:



    Der Lebenszyklus von BSActivity selbst kann wie folgt dargestellt werden: Das



    Starten der Anwendung auf dem zweiten Bildschirm entspricht dem Starten des Standard-Android-Dienstes:

    mContext.startService(BSActivityIntent);
    


    Beschreiben wir den dargestellten Lebenszyklus genauer:

    BSActivity erhält beim Start einen Callback auf BSCreate () und registriert sich im YotaPhone Manager als Anwendung für die zweite Anzeige, die das Symbol, den Titel erhält und im Task-Manager sichtbar wird. Sie wird durch langes Drücken auf die Touch-Zone des zweiten Displays angezeigt.

    Wenn eine Anwendung für die zweite Anzeige gestartet wird oder der Benutzer den Task-Manager öffnet, stoppt YotaPhone Manager die aktuelle BSActivity, indem er einen Rückruf an BSPause (), onBSStop () sendet. Danach erhält die Anwendung einen Rückruf von onBSDestroy () (ähnlich wie onDestroy () im Standard-Android-Dienst) und wird beendet.

    Im Rückruf onBSSaveInstanceState (Bundle savedInstanceState), der nach onBSPause () aufgerufen wird, können Sie beliebige Daten speichern. Wenn die Anwendung auf dem zweiten Bildschirm einen Rückruf bei BSPause () erhält, wird sie inaktiv (Bilder auf dem zweiten Bildschirm können nicht angezeigt werden und Informationen zu Steuergesten können nicht von der Berührungszone des zweiten Bildschirms empfangen werden). Gleichzeitig kann die Anwendung jederzeit einen Rückruf auf BSStop () erhalten. Wenn Sie Informationen an BSActivity übertragen möchten, müssen Sie die Methode onHandleIntent (Intent intent) beim Start neu definieren, um darauf zuzugreifen.

    Funktionen zum Anzeigen von Bildern auf dem zweiten Bildschirm


    Wie Sie sich erinnern, weist der Bildschirm für elektronische Tinte eine Reihe von Funktionen auf, die bei der Entwicklung berücksichtigt werden müssen. Eine typische Methode zum Anzeigen eines Bildes auf einem zweiten Bildschirm lautet wie folgt:

    getBSDrawer().drawBitmap(bitmap, Waveform.WAVEFORM_GC_FULL);
    


    Das zweite Argument ist hier Wellenform. Dies ist eine Reihe von Anweisungen für den Display-Controller zum Zeichnen eines Bildes. Im YotaPhone SDK gibt es vier Haupttypen von Wellenformen, die miteinander kombiniert werden können.
    • GC_FULL. Wird verwendet, um die Anzeige vollständig zu aktualisieren, wenn das aktuelle Bild durch ein neues ersetzt wird. Bietet eine hohe Bildqualität.
    o 4 Bit, 16 Graustufen.
    o ~ 600 ms.
    o Der Zeichenvorgang wird von einem einzelnen Flackern auf dem Display begleitet.
    o Geringer Ghosting-Effekt.
    • GC_PARTIAL. Es wird verwendet, um das Bild teilweise zu aktualisieren. Nur der Teil des Bildschirms, in dem sich das Bild geändert hat, wird neu gezeichnet.
    o 4 Bits, 16 Graustufen.
    o ~ 600 ms.
    o Kein Flimmern
    o Es gibt einen Ghosting-Effekt.
    • DU (Direct Update). Eine schnelle Aktualisierungsmethode, die nur zwei Farben unterstützt: Schwarz und Weiß. Es werden keine Schattierungen unterstützt. Diese Wellenform wird am bequemsten für Menüauswahlanzeigen oder zum Anzeigen von Text verwendet.
    o 1 Bit (schwarz oder weiß)
    o ~ 250 ms
    o Kein
    Flimmern , nur ein Teil des Bildes wird aktualisiert. o Es gibt einen Ghosting-Effekt.
    • A2. Eine noch schnellere Methode, mit der die Seite schnell aktualisiert oder eine einfache Schwarzweißanimation erstellt werden kann. Es werden nur zwei Farben unterstützt - Schwarz und Weiß.
    o 1 Bit schwarz oder weiß
    o ~ 120 ms
    o Kein
    Flimmern , nur ein Teil des Bildes wird aktualisiert. o Es ist ein Ghosting-Effekt vorhanden

    Bildoptimierung auf dem zweiten Display


    EPDs unterscheiden sich stark von LCDs. Daher sehen Bilder, die auf dem Hauptdisplay gut aussehen, auf der zweiten Seite oft mittelmäßig aus. Das YotaPhone SDK enthält jedoch mehrere Methoden, um die Qualität der Anzeige auf dem zweiten Bildschirm zu verbessern. Insbesondere können Sie Dithering (Farbmischung), Schärfe, Helligkeit und Kontrast einstellen.

    Glättung . Da elektronische Tinte 16 Farben (Graustufen) und LCD - 16 777 216 Farben anzeigt, ist das Mischen von Farben der logischste Schritt. Das YotaPhone SDK unterstützt zwei Algorithmen: Atkinson (in den meisten Fällen verwendet) und Floyd-Steinberg (für Bilder mit vielen Verläufen).

    Sie können zwei Methoden zum Anwenden der Farbmischung anwenden:

    bitmap = EinkUtils.ditherBitmap(bitmap, ATKINSON_DITHERING);
    

    getBSDrawer().drawBitmap(0, 0, bitmap, BSDrawer.Waveform.WAVEFORM_GC_PARTIAL, EinkUtils.ATKINSON_DITHERING);
    


    Schärfe . Elektronische Tinte verwischt das Bild etwas und das Schärfen hilft, diesen Effekt zu bekämpfen. In unserem Algorithmus wird die Twist-Matrix verwendet:



    Ein Beispiel für das Schärfen von Code für k = 0,15:

    bitmap = BitmapUtils.sharpenBitmap(context, bitmap, 0.15f);
    


    Kontrast und Helligkeit. Durch die Verbesserung des Kontrasts wird auch der Unschärfeeffekt des Bildes auf der zweiten Anzeige verringert. Es wirkt sich aber auch auf die Helligkeit aus, die in diesem Fall reduziert werden muss.

    Beispielcode zum Erhöhen des Kontrasts um den Faktor 1,2 und Verringern der Helligkeit um 30:

    bitmap = BitmapUtils.changeBitmapContrastBrightness(bitmap, 1.2f, -30)
    


    Ein Beispiel für einen Standard-Bildverarbeitungscode für die Ausgabe auf die zweite Anzeige:

    1) Erhöhen Sie die Schärfe bei k = 0,15.
    2) Erhöhen Sie den Kontrast um den Faktor 1,2 und verringern Sie die Helligkeit um 30.
    3) Verwenden Sie den Atkinson-Mischalgorithmus, um eine 16-Farben-Palette zu erstellen:

    bitmap = BitmapUtils.prepareImageForBS(context, bitmap);
    getBSDrawer().drawBitmap(0, 0, bitmap, BSDrawer.Waveform.WAVEFORM_GC_PARTIAL, EinkUtils.ATKINSON_DITHERING);
    


    Benachrichtigungen


    Einer der Hauptvorteile der zweiten Anzeige in YotaPhone ist die Möglichkeit, benutzerdefinierte Benachrichtigungen anzuzeigen. Es gibt drei Arten von Benachrichtigungen. Die Art der Benachrichtigung, ihre Position auf dem Bildschirm und die Anzeigezeit werden von der übergeordneten Anwendung festgelegt.

    • Vollbildbenachrichtigung. Am besten für die Anzeige von Bildern oder einer vergleichbaren Textmenge.


    • Benachrichtigungshalbbildschirm. Immer ganz unten, hauptsächlich für kurze Textnachrichten.


    • Panel-Benachrichtigungen. Die kleinste Ansicht kann Symbole und Text enthalten.


    Vollbild und Halbbild nach 60 Sekunden werden auf die Größe des Panels reduziert. Nach weiteren 60 Sekunden werden Benachrichtigungen nur im Zähler für ungelesene Benachrichtigungen angezeigt.

    Rotationsalgorithmus


    Da YotaPhone über zwei Touch-Oberflächen verfügt, ist ein sehr übersichtlicher Entriegelungsmechanismus erforderlich, um versehentliche Aktionen des Benutzers zu verhindern. Zu diesem Zweck haben wir einen „Schaltalgorithmus“ entwickelt, der Informationen von den Sensoren des Geräts verwendet, um seine Position im Raum zu bestimmen und das entsprechende Display zu entsperren. Dadurch erhält der Benutzer den Eindruck eines einzelnen Arbeitsbereichs auf zwei Displays und nicht auf zwei unterschiedlichen Geräten.

    Algorithmus 1:
    • Der Benutzer führt eine Aktion mit dem Smartphone aus -> das Gyroskop und der Beschleunigungsmesser werden eingeschaltet.
    • Wenn der Benutzer das Smartphone 4 Sekunden lang nicht umdreht, werden die Sensoren ausgeschaltet
    • Wenn Sie nicht innerhalb von 4 Sekunden umdrehen -> wird das Hauptdisplay gesperrt und das zweite entsperrt (wenn diese Aktion nicht durch die Software blockiert wird). Die Sensoren arbeiten noch 4 Sekunden weiter.
    • Wenn der Benutzer während dieser zweiten 4 Sekunden das Smartphone zurückklappt -> das zweite Display ist gesperrt, das Hauptdisplay ist entsperrt, die Sensoren werden
    ausgeschaltet. Der Benutzer benutzt weiterhin die zweite Anzeige.

    Algorithmus 2:
    • Der Benutzer führt eine Aktion mit der zweiten Anzeige durch -> das Gyroskop und der Beschleunigungsmesser werden eingeschaltet
    • Wenn der Benutzer das Smartphone 4 Sekunden lang nicht
    umdreht -> die Sensoren werden ausgeschaltet, der Status des Hauptdisplays ändert sich nicht, der Benutzer verwendet weiterhin das zweite Display .

    Nachfolgend finden Sie ein Beispiel für einen Code, der den Umschaltalgorithmus nach dem Drücken einer Taste auf dem Hauptdisplay startet, wodurch der Benutzer erwartet, auf das zweite Display umzuschalten:

    mButtonP2B.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            RotationAlgorithm.getInstance(getApplicationContext()
        ).issueStandardToastAndVibration(); //To let the user know that he is expected to rotate the phone now
        RotationAlgorithm.getInstance(getApplicationContext()
        ).turnScreenOffIfRotated(); //Perform drawing on back screen here
        }
    });
    


    Nachwort


    Wie Sie bereits bemerkt haben, haben wir versucht, die Arbeit der Anwendungsentwickler für YotaPhone so einfach wie möglich zu gestalten. Wenn Sie bereits Erfahrung mit der Entwicklung für Android haben, wird die Beherrschung unseres SDK keine Schwierigkeiten bereiten.

    Separat möchten wir Sie auf die Entwicklung von Anwendungen für das zweite Display aufmerksam machen. Funktionen der elektronischen Tintentechnologie und die Tatsache, dass zwei Displays auf einem Smartphone vorhanden sind, erfordern eine sorgfältige Vorgehensweise bei der Bildanpassung. Für eine eingehendere Untersuchung dieses Problems empfehlen wir, dass Sie sich auf den entsprechenden Abschnitt unserer Website für Entwickler beziehen .

    Wir arbeiten derzeit an der SDK-Architektur für das YotaPhone der zweiten Generation, die wir bereits grundlegend überarbeitet und verbessert haben.

    Jetzt auch beliebt: