Zu Beginn des Technischen Entwurfes wurden UML-Diagramme erstellt, die die Architektur der Applikation darstellen sollten.
UML bedeutet Unified Modeling Language und ist eine Sprache zur Visualisierung und Konstruktion von Modellen einer Software oder Anwendung vor ihrer Umsetzung. Diese Sprache bietet Entwicklern eine einheitliche Entwurfsbasis zur gemeinsamen Diskussion über das Aussehen der zu entwicklenden Software. Diese Sprache wurde Ende der 90er Jahre entwickelt und gilt heute mittlerweile mit der Version 2.4 als allgemeiner Standard.
Beider Modellierung kreiert man Diagramme, die verschiedene Sachverhalte der Software darstellen. Die bekanntesten sind Klassen-, Aktivitäts- und Anwendungsfalldiagramme.
Das Klassendiagramm zeigt ein vollstädiges Abbild des Systems: dessen Klassen, Methoden und Variablen. Das Aktivätsdiagramm beschreibt das Verhalten der Software als eine Menge von elemntaren Aktionen, zwischen welchen Datenflüsse existieren.
Anwendungsfalldiagramme beschreiben die Anforderungen an das System, welche Aufgaben dieses im Elementaren- und Gesamtkontext zu erfüllen hat. (1)
Für die Modellierung solcher Diagramme gibt es eine Vielzahl von Programmen, die den vollen Funktionsumfang von UML 2.4 abdecken.
Für unsere Modellierung haben wir das Open-Source- Tool UMLet in der Version 12.0 verwendet. (2) Es ist ein einfaches, Java und xml-basiertes Tool, welches auf simple Art dem Anwender eine persönlich angepasste Modellierung der gewünschten Diagramme ermöglicht und gleichzeitig eine Vielzahl von Vorlagen bietet. Ein Export als Bild ist ebenfalls ohne Probleme möglich. Einzige Manko: Das Fehlen eines Programmcodegenerators, was aber nicht weiter negativ auffällt.
Für unsere Modellierung der Architektur hatten wir uns nur auf das Erstellen eines Aktivitätsdiagramms für das Senden und Empfangen der Nachrichten und das Klassendiagramm beschränkt.
Unser Aktivitätsdiagramm sollte den Sende- und Empfangsvorgang der Applikation anhand elementarer Aktionen in einem Kontrollflussgraphen aufzeigen.

Das folgende Diagramm stellt den Sendevorgang der Applikation dar.
BILD

Nach dem Starten der Applikation muss das System den Status des BluetoothServices überprüfen. Dieser muss aktiv sein oder - bei Nichtaktivität - durch den Benutzer oder automatisch durch die Applikation selber - aktiviert werden. Der BluetoothService beinhaltet alle für die Bluetoothumgebung relevanten Funktionen.
Nach der erfolgreichen Aktivierung des BS Service muss das System dem Nutzer die Möglkeit geben den Service der Zwischenablage zu aktivieren (ClipBoardService). Über diesen wird dem Anwender eine automatisierte Einfügemöglichkeit bereitgestellt. Läuft der ClipBoardService nicht, so ist der Anwender gezwungen den Text außerhalb der Applikation zu kopieren und händisch in die Applikation wieder einzufügen. Ist der ClipBoardService aktiv bzw. wird durch den Anwender aktiviert, wird die Zwischenablage durch diesen überwacht, erkennt den Kopiervorgang und zeigt eine Benachrichtigung an, durch welche die Applikation automatisch mit dem kopierten Text aus der Zwischenablage geöffnet wird.
Danach muss das System die Mögkichkeit bieten einen Empfänger für die Nachricht auszuwählen: Man unterscheidet dabei zwischen im System gespeicherten, gepaarten und neuen Geräten. Existiert noch keine Paarung, muss die Anwendung dem Nutzer die Möglichkeit bereitstellen, neue Geräte zu suchen und sich mit diesen zu paaren. Nach erfolgreicher Auswahl des Emfängers muss das System den Sendevorgang starten und erfolgreich ausführen. Danach ist der Sendevorgang beendet.

Auf der Gegenseite wird die gesendete Nachricht empfangen. Das nachfolgende Aktivitätsdiagramm stellt diesen Vorgang dar:
BILD

Das System prüft zunächst, ob eine aktive Paarung der beiden Geräte existiert. Ist es nicht der Fall, bekommt der Nutzer zunächst eine Paarungsanfrage, die dieser in der Applikation akzeptieren muss. Ist eine erfolgreiche Verbindung hergestellt, muss das System den Nutzer über eine emfangene Nachricht benachrichtigen. Durch die Auswahl der Benachrichtung, wird die Applikation geöffnet und die empfangene Nachricht angezeigt.
Hier muss das System den Nachrichtentyp erkennen und eine Auswahl über die weiteren möglichen Aktionen treffen. Bei einer Textnachricht muss das System den empfangenen Text anzeigen und dem Nutzer die Möglichkeit geben diesen zu verwerfen oder direkt in die eigene Zwischenablage zu kopieren. Bei einer Dateinachricht muss das System die Dateiinformationen anzeigen und dem Nutzer die Möglichkeit geben die Nachricht mit dem Standardprogramm für den jeweiligen Dateitypen zu öffnen oder die Datei zu löschen. Nach beiden möglichen Aktionen ist der eigentliche Sendevorgang beendet.

Das Androidbetriebsystem verwendet sog. Acitvities. Eine Activity (dt. Aktivität) soll genau eine Aktivität repräsentieren, die der Anwender dieser Software durchführen kann. In der Praxis heißt dies, dass eine Activity als GUI-Element ein Fenster ist, dass dem Anwender eine Schnittstelle zur der entsprechenden Funktionalität der Acitvity bietet. (3)
Bei der App Capood sind die Klasse in zwei Pakete unterteilt. Ein Paket bildet die Datenlogik und das zweite die GUI.
Das GUI-Paket enthält alle Activities. Es gibt Activities für dasn Senden und Empfangen jeweils von Textinhalten und Dateien, zur Auflistung der empfangenen Nachrichten, zur Suche von Empfängergeräten, für persöhnliche Einstellungen (Optionsmenü) und das Hauptmenü.
Das Datenlogik-Paket beinhaltet Klassen, deren Aufgaben das Verwalten der Daten und Dateien und der Bluetooth-Verbindung zwischen zwei Geräten ist.

Im Folgenden werden die Funktionen aller wichtigen Klassen einzeln erläutert:

Storage:
Die Storage-Klasse verwaltet die empfangenen Nachrichten. Textnachrichten und Dateinachrichten werden persistent und serialisiert in einer Textdatei gespeichert. Diese liegt im internen Speicherbereich der App, sodass niemand anderes (Anwender oder App) berechtigt ist, auf diese Datei zuzugreifen.

Message:
Die abstrakte Message-Klasse bildet die Basis für alle versendbaren Nachrichten. Eine Message hat immer ein Datum und einen Typ (realisert als Enum).

TextMessage:
Die TextMessage-Klasse dient zum Versand von Textnachrichten.

FileInfoMessage:
Die FileInfoMessage-Klasse stellt Informationen zu einer Datei bereit. Sie wird vor dem eigentlichen Versand einer Datei verschickt. Der Empfänger kann die Informationen der Datei einsehen und diese dann nach Bedarf annehmen oder ablehnen.

BooleanMessage:
Die BooleanMessage-Klasse dient zum Annehmen oder Ablehnen einer Datei.

FileMessage:
Die FileMessage-Klasse ist ein Wrapper für eine Datei. Die eine Instanz dieser Klasse enthält ein byte-Array mit den Bytes der repräsentierten Datei.

BluetoothService:
Der BluetoothService repräsentiert die Buetoothverbindung. Er erbt von der Klasse Service und wird auf Wunsch den Nutzer im Hintergrund gestartet. Wenn der Bluetoothservice aktiv ist und der Bluetoothadapter des Gerätes eingeschaltet ist, dann wartet der Bluetoothservice permanent auf eine eingehende Bluetoothverbindung für die App Capood (AcceptThread). Gleichzeit wird über ihn auch die aktive Verbindungsaufnahme zu eine Empfänger gestartet (ConnectThread). Nach erfolgreichem Verbindungsaufbau haben sowohl Sender als auch Empfänger einen ConnectedThread, der die laufende Verbindung repräsentiert. Jedes Gerät hat Input- und Outputstreams des Verbindungspartners. Über die Klassen ObjectInputStream und ObjectOutputStream werden die Nachrichten als Message-Objekte serialisert übertragen. Der BluetoothService basiert auf der Klasse BluetoothChatService aus dem Beispielprojekt BluetoothChat, welches von Android bereitgestellt wird.

ClipListenService:
Der ClipListenService ist ebenfall ein Service, der auf Wunsch des Users im Hintergrund läuft. Er überwacht die Zwischenablage (Interface OnPrimaryClipChangedListener). Sobald der Anwender einen neuer Text in die Zwischenablage kopiert, wird vom ClipListenService eine Benachrichtigung erstellt. Diese zeigt dem Anwender, dass ein Text in die Zwischenablage kopiert wurde. Nach dem öffnen der Benachrichtungs öffnet sich die SendingTextActivity. Der Inhalt der Zwischenablage wird automatisch in das Textnachrichtenfeld eingefügt.

DeviceListActivity:
Die DeviceListActivity wurde ohne Veränderungen aus dem Beispielprojekt Bluetoothchat übernommen. Sie dient zur Suche nach Bluetoothgeräten. Nach dem Aufruf wird sie als Popup über der aktiven Activity angezeigt und listet alle schon gepaarten Geräten auf. Der Nutzer hat die Möglichkeit weitere Geräte zu suchen.

SendingTextActivity:
Die SendingTextActivity ist die Nutzerschnittstelle zum Versenden von Textinhalten. Ein großes EditText-Feld bietet die Möglichkeit Text einzugeben. Die maximale Zeichenanzahl ist auch 1000 Zeichen begrenzt und wird auch grafisch unterhalb des Eingabefeldes angezeigt. Sie ist durch die Konstante MAX_CHARS gegebenfalls auch mit wenig Aufwand anpassbar.

SendingFileActivity:
Die SendingFileActivity repräsentiert das Versendn von Dateien. Sie kann nicht direkt vom Nutzer ausgerufen werden. Der Aufruf erfolgt über Intentfilter zu der Systemeigenen Sendeaktion (android.intent.action.SEND) für die MIME-Typen (Multipurpose Internet Mail Extensions) für Bilder, Videos, Audio und Anwendungen. Der Intenfilter wird in der Androidmanifest-Datei definiert.

ReceivingTextActivity:
Die ReceivingTextActivity wird immer dann geöffnet, wenn ein Textmessage empfangen wird und die daraus resultierende Benachrichtung angewählt wird. Der Textinhalt der Nachricht wird dem Nutzer präsentiert. Er kann außerdem über einen Button den Inhalt in die Zwischenablage kopieren.

ReceivingFileActivity:
Die ReceivingFileActivity wird immer dann geöffnet, wenn eine FileInfoMessage empfangen wird und die daraus resultierenden Benachrichtung angewählt wird. Dem Nutzer wird zuerst ein Dialog angeigt mit der Frage, ob der Nutzer die durch die FileInfoMessage repräsentierte Datei empfangen möchte. Sollte der Anwender dies bestätigen, wird der Dateiversand durchgeführt. Mit einem Button kann die Datei, sofern vorhanden, geöffnet werden. Dies wird mit der Systemaktion zum Öffnen (android.content.Intent.ACTION_VIEW) realisiert. Anschließend wird die Datei mit dem Standardprogramm für den entsprechenden Dateitypen geöffnet.

HistoryActivity:
Die HistoryActivity zeigt alle empfangen Nachrichten sortiert nach Datum in einer ListView an. Dafür wurde eine eigene Adapterklasse (MessageAdapter) implementiert. Eine angewählte Nachricht über einen Button gelöscht werden. Durch längeren Druck am Touchscreen auf eine Nachricht wird diese geöffnet.

SettingsActivity:
Die SettingsActivity bietet über zwei Checkboxen die Möglichkeit, den ClipListenService und den BluetoothService an- und auszuschalten.


(1) http://www-ivs.cs.uni-magdeburg.de/~dumke/UML/ 15.07.13. 12.01
(2) http://umlet.com/ 15.07.13 12.20
(3) Bach (2012), S.281