Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Projektabgabe Riekemann, Joel (DistroTailor) #5

Open
wants to merge 27 commits into
base: e11_save_chat
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
6c849ab
initial commit
h0useofdupree Nov 28, 2023
41f42fb
Add README
h0useofdupree Nov 28, 2023
7d6d604
Convert README to DE
h0useofdupree Nov 28, 2023
5ca676c
test
h0useofdupree Nov 28, 2023
d3bed12
README structure
h0useofdupree Nov 28, 2023
2cc3fef
add first settings structure and strings
h0useofdupree Nov 28, 2023
8cd6e37
add all settings
h0useofdupree Nov 28, 2023
8e04580
add config enums and classes
h0useofdupree Nov 28, 2023
d79120a
add first distro selection and output
h0useofdupree Nov 28, 2023
98c34d0
add more arrays and strings and prefs
h0useofdupree Nov 28, 2023
78d0a1d
removed enums, too complicated for now
h0useofdupree Nov 28, 2023
6c84c7c
remove sts and tts
h0useofdupree Nov 28, 2023
6523cbd
adjusted for use with retrieved settings
h0useofdupree Nov 28, 2023
b3e1046
added stuff like summaries and other processing
h0useofdupree Nov 28, 2023
3480fe9
rest
h0useofdupree Nov 28, 2023
02fcecb
finalizing
h0useofdupree Nov 29, 2023
aaaedd5
fix timeout and view hierarchy error
h0useofdupree Nov 29, 2023
959c169
more improvements + markdown parsing
h0useofdupree Nov 29, 2023
5ef8962
first add model selection setting
h0useofdupree Nov 29, 2023
d90498a
add documentation in README
h0useofdupree Nov 30, 2023
a07a34c
add model selection and refactored
h0useofdupree Nov 30, 2023
2155808
Create android.yml
h0useofdupree Nov 30, 2023
14a65d4
add workflow badge
h0useofdupree Nov 30, 2023
54969f7
fix worklfow badge
h0useofdupree Nov 30, 2023
74b007d
Update android.yml
h0useofdupree Nov 30, 2023
1ec2af1
update readme
h0useofdupree Dec 1, 2023
bae8b59
design
h0useofdupree Dec 1, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/android.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Android CI

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- name: set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
cache: gradle

- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew build
1 change: 1 addition & 0 deletions .idea/.name

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

106 changes: 106 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
<!--
vim:foldmethod=marker
-->

![Android Workflow](https://github.com/h0useofdupree/app_entwicklung_MFAX422A/actions/workflows/android.yml/badge.svg)

# _DistroTailor_

## Einleitung

### Überblick

_DistroTailor_ ist eine Erweiterung der bisher entwickelten 'Proof-Of-Concept' GPT-Client-App,
welche den Prozess der Linux-Installation für Anfänger vereinfacht.

### Motivation

Der Installationsprozess kann, gerade bei manuell konfigurierten Distros wie Arch,
Gentoo oder sogar DIY Distros wie LFS, für Anfänger eine große Herausforderung darstellen.
ChatGPT kann da recht zuverlässig helfen.
Der Prozess ist aber mit wichtigen Custom Instructions verbunden, welche nicht
immer einen Nutzen für andere Anliegen haben. _DistroTailor_ löst dieses Problem.

## Anforderungen

### Was soll _DistroTailor_ leisten?

Distro Tailor soll aufgrund von einfacher und verständlicher Konfiguration
in einem Konfigurationsmenü eine simpel formatierte, GPT-Markdown
unterstützende Linux-Installation ermöglichen.

Der User kann in der Konfiguration folgende Eigenschaften auswählen

- Distribution
- Kernel
- GPU Hersteller
- Display Server
- Desktop Environment
- Login Manager
- Window Manager
- Packages
- Firewall

_DistroTailor_ ist so konzipiert, dass Eigenschaften und
Konfigurationsmöglichkeiten, sowie der Befehl selbst,
einfach angepasst und aktualisiert werden können.

## Umsetzung
### UI/UX
- Settings angepasst:
- API-Key und Sprache in seperates Untermenü (PreferenceScreen)
- PreferenceCategories für alle benötigten Konfigurationsmöglichkeiten
- Distro:
- Auswahl für Custom Distro wenn in ListPref 'Custom' ausgewählt wird
- Packages:
- Multi Select List mit Custom Summary Logik
### Logik
- Speech to Text und Text to Speech entfernt
#### Methoden etc. (nur essentiell)
- getQueryInstructions()
- (gibt allg. Custom Instructions zurück)
- getSelectedDistribution()
- (gibt Distribution, egal ob Standard oder Custom zurück)
- getSelectedValueFor()
- (gibt Inhalt für übergebenen key)
- getSelectedPackages()
- (gibt gewählte packages in string durch stringbuilder aus Set (Hash Map) zurück)
- displayResponseAsMarkdown()
- (Rendert Response als Markdown in TextView)
- applyLanguage()
- processQuery()
- (angepasst für usecase)
##### PrefsActivity
- onNavigateToScreen()
- (Logik für sub-PreferenceScreen)
- languagePref ChangeListener
- (wartet auf Änderungen der Language Pref)
- distributionPref ChangeListener
- (wartet auf Änderungen der Distro Pref, respektiert Custom Setting)
- packagesPref SummaryProvider
- (custom SummaryProvider für packages, konvertiert in Hash Map)
##### ChatGPT
- Duration auf 600 Sekunden geändert 😡

### XML
- root_preferences wie oben beschrieben angepasst
- arrays.xml mit möglichen Werten für Settings gefüllt
- strings.xml mit **allen** Übersetzungen gefüllt

## Probleme / 'Lessons learned'
### Zu viele Features geplant
Ich habe mir zu viel vorgenommen.
- Jede Settings sollte ihren eigenen Enum bzw. eigene Klasse haben, um Type Safety und Future Proofing zu garantieren.
- User sollten Konfigurationen abspeichern und aufrufen können
- Selektion der Konfigurationen sollte per grid-like UI ermöglicht werden
### GPT Duration Setting
- Zu viel Zeit damit verschwendet, lange response times zu unterstützen
### UI
- Keine Zeit für Design Language, Dark Theme, Theme Switcher, Material You

## Fazit
Dieses Projekt war meine erste 'richtige', nutzvolle Android Native App. Ich habe versucht Boiler Plate Code zu vermeiden, bin letzten Endes aber doch in der Repetition-Hölle gelandet - glaube ich zumindest.

Auf eine, nur bedingt verfügbare API mit sehr sensiblen Secret-Exposion Regeln, angewiesen zu sein, hat sich als sehr anstrengend in einer Entwicklungsumgebung entpuppt.

Im Großen und Ganzen bin ich aber zufrieden mit meiner Leistung und werde definitiv das nächste Projekt starten, sobal ich wieder Freizeit habe.
63 changes: 63 additions & 0 deletions RELATIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!-- {{{ Übersicht -->
## Anwendungsarchitektur - UML-artige-Übersicht

### Klassen

#### MainActivity
- Erweitert: `AppCompatActivity`
- Methoden: `onCreate(Bundle)`, `onCreateOptionsMenu(Menu)`, `onOptionsItemSelected(MenuItem)`
- Assoziationen: Verbindungen zu `PrefsActivity` und `MainFragment`

#### MainFragment
- Erweitert: `Fragment`
- Attribute: `prefs`, `textToSpeech`, `chat`
- Methoden: `onCreateView(LayoutInflater, ViewGroup, Bundle)`, `onViewCreated(View, Bundle)`, `onPause()`, `onSaveInstanceState(Bundle)`, `onDestroy()`
- Assoziationen: Verwendet `PrefsFacade`, `TextToSpeechTool`, `Chat`, `LaunchSpeechRecognition`

#### PrefsActivity
- Erweitert: `AppCompatActivity`
- Innere Klasse: `SettingsFragment` (erweitert `PreferenceFragmentCompat`)
- Methoden: `onCreate(Bundle)`, `onOptionsItemSelected(MenuItem)`

#### PrefsFacade
- Attribute: `context`
- Methoden: `getApiToken()`
- Assoziationen: Wird von `MainFragment` verwendet

#### LaunchSpeechRecognition
- Erweitert: `ActivityResultContract`
- Innere Klasse: `SpeechRecognitionArgs`
- Methoden: `createIntent(Context, SpeechRecognitionArgs)`, `parseResult(int, Intent)`

#### TextToSpeechTool
- Implementiert: `TextToSpeech.OnInitListener`
- Attribute: `textToSpeech`, `ttsAvailable`, `locale`
- Methoden: `onInit(int)`, `speak(String)`, `stop()`, `destroy()`
- Assoziationen: Wird von `MainFragment` verwendet

#### ChatGpt
- Attribute: `apiToken`
- Methoden: `getChatCompletion(Chat)`
- Assoziationen: Verwendet `OpenAiService`, interagiert mit `Chat`

#### Author
- Typ: Aufzählung
- Werte: `User`, `Assistant`, `System`

#### Chat
- Implementiert: `Parcelable`
- Attribute: `messages` (Liste von `Message`)
- Methoden: `addMessage(Message)`, `getMessages()`

#### Message
- Implementiert: `Parcelable`
- Attribute: `date`, `author` (Author), `message` (String)
- Methoden: Konstruktoren, Parcelable-Methoden

### Assoziationen
- `MainActivity` navigiert zu `PrefsActivity` und `MainFragment`.
- `MainFragment` verwendet `PrefsFacade`, `TextToSpeechTool`, `Chat` und `LaunchSpeechRecognition`.
- `PrefsFacade` wird von `MainFragment` für die Verwaltung von Einstellungen verwendet.
- `TextToSpeechTool` wird von `MainFragment` für Text-zu-Sprache-Funktionalitäten verwendet.
- `ChatGpt` interagiert mit `Chat` zur Verarbeitung von Chatnachrichten.
<!-- }}} -->
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,5 @@ dependencies {
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
implementation 'io.noties.markwon:core:4.6.2'
}
Loading