Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
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.

75 changes: 75 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# app_entwicklung_MFAX422A

# Einleitung:
Ich habe die Benutzerfreundlichkeit und Anpassungsährtikeit durch meine erweiterung verbessert. Diese wären, die Settings erweitert, Es gibt jetzt mehrsprachen zur auswahl und die ChatGpt version lässt sich in den einstellung ändern. Zu dem gibt es die Möglichkeit die TTS aus oder an zu schalten. Der Reset button kann auch den TTS stoppen und haben ein neues Design.

# Anforderungen:
In den Einstellung unter den Reiter Sprache, gib es jetzt die Möglichkeit, die Sprache über die Einstellung zu ändern, die Standartsprache ist die Gerätsprache.
Die Einstellung werden direkt in selben Fenster übersetzt und ChatGpt und der Google Voice assistent der das gesprochende aufnimmt benutzen die ausgewählte sprache.
Die Sprachen werden über eine Liste angzeigt und mit einem Radio Button ausgewählt. Die TTS soll über eine Checkbox an oder ausgestellt werden. Unter den Reiter API
kann wie voher der API Key übergeben werden zu dem kann jetzt aber auch dort über ein Radio Button die Version von ChatGpt geändert werden, Standartgemäß ist ChatGpt 3.5. Die Buttons haben ein Unicode als inhalt bekommen damit Sie verständlicher sind. Zu dem kann der Resetbutton die TTS stoppen.


# Umsetzung:
## Spracheinstellungen:
1.Auswahl der Sprache:
-Benutzer können nun in den Einstellungen eine Sprache auswählen.
-Die Standard-Sprache entspricht der Gerätesprache.
-Eine Liste von verfügbaren Sprachen wird angezeigt, und Benutzer können ihre Auswahl über Radio Buttons treffen.

2.Text-to-Speech (TTS):
-Benutzer haben die Möglichkeit, die TTS-Funktion ein- oder auszuschalten.
-Die TTS-Sprache wird ebenfalls basierend auf der ausgewählten Sprache festgelegt.

## ChatGpt-Version:
API-Version ändern:
-Benutzer können in den Einstellungen die Version von ChatGpt über einen Radio Button auswählen.
-Der API-Schlüssel kann weiterhin übergeben werden.

## Reset-Button:
Stoppen der TTS:
-Der Reset-Button kann jetzt auch die TTS stoppen.

## UI-Elemente:
Unicode-Symbole:
-Unicode-Symbole für die Buttons hinzugefügt, um die Bedeutung klarer zu machen.

## Code-Snippets:
1. Initialisierung von ChatGpt:
-Die ChatGpt-Klasse wird mit dem API-Token initialisiert.
2. Spracheinstellungen in der App:
-Die App-Konfiguration wird auf die ausgewählte Sprache eingestellt.
-Die Sprache wird auch für die Text-to-Speech-Funktion festgelegt.
3. Sprache ändern in den Einstellungen:
-Die ausgewählte Sprache kann direkt in den Einstellungen geändert werden.
4. Einstellungen in der XML-Datei:
-XML-Dateien werden aktualisiert, um die neuen Einstellungen und Symbole zu berücksichtigen.
5. Gradle-Dateien:
-Die Versionsnummer der Android-Gradle-Plugin wurde auf 8.1.2 aktualisiert.

## API-Version in ChatGpt:
-Die ChatGpt-Klasse wird mit der Ausgewählten ChatGpt-Version initialisiert.

## Ressourcendateien:
-Strings und Listen für verschiedene Sprachen und ChatGpt-Versionen wurden in den Ressourcendateien hinzugefügt.

## Einstellungen-Bildschirm:
-Ein PreferenceScreen wurde erstellt, um Benutzern die Auswahl von Sprache, TTS und ChatGpt-Version zu ermöglichen.


# Probleme/Lessons learned:

Bei der Umsetzung meiner Erweiterungen stellte ich fest, dass ich weniger erreichen konnte als ursprünglich erhofft. Ich habe mir zu weniger Zeit für die
Fehlersuche eingeplant hatte, und diese Suche sich als zeitaufwendiger herausstellte als erwartet. Ich habe dennnoch versucht so viele erweiterung wie möglich zu
schreiben. Um die Benutzerfreundlichkeit zu verbessern. Es war jedoch klar, dass eine gründlichere Planung und mehr Zeit für eine bessere Fehlerbehebung in
Zukunftnotwendig sein wird, um ein reibungsloses Implementieren von Funktionen zu gewährleisten.

# Fazit:

Wie bereits bei Probleme/Lessone learned erwähnt. Habe ich viel zu viel Zeit verloren um Fehler zu beheben und konnte nicht so viel erweiterung implemntieren wie
gehoft. Da man an manchen fehlern mehrere stunden dran gessessen hat. Diese Zeit habe ich mir nicht eingeplant. Denn noch habe ich es geschaft gute Erweiterung für die
App zu schreiben.

Wie schon im Abschnitt "Probleme/Lessons Learned" erwähnt, habe ich ziemlich viel Zeit verloren, um Fehler beheben und konnte. Das hat mir mein Zeitplan
durcheinandergebracht, und ich konnte nicht so viele Erweiterungen in die App einbauen, wie ich gehofft hatte. Mehrere Fehler haben mich Stunden gekostet, dass
hatte ich nicht eingeplant Aber trotzdem hab ich es hingekriegt viele Erweiterung zu Implementieren.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import android.view.Menu;
import android.view.MenuItem;

import java.util.Locale;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package de.fhdw.app_entwicklung.chatgpt;

import android.content.SharedPreferences;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
Expand All @@ -12,15 +15,15 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.preference.PreferenceManager;

import java.util.List;
import java.util.Locale;

import de.fhdw.app_entwicklung.chatgpt.model.Author;
import de.fhdw.app_entwicklung.chatgpt.model.Chat;
import de.fhdw.app_entwicklung.chatgpt.model.Message;
import de.fhdw.app_entwicklung.chatgpt.openai.IChatGpt;
import de.fhdw.app_entwicklung.chatgpt.openai.MockChatGpt;
import de.fhdw.app_entwicklung.chatgpt.openai.ChatGpt;
import de.fhdw.app_entwicklung.chatgpt.speech.LaunchSpeechRecognition;
import de.fhdw.app_entwicklung.chatgpt.speech.TextToSpeechTool;

Expand All @@ -46,7 +49,7 @@ public class MainFragment extends Fragment {

MainActivity.backgroundExecutorService.execute(() -> {
String apiToken = prefs.getApiToken();
IChatGpt chatGpt = new MockChatGpt(apiToken);
ChatGpt chatGpt = new ChatGpt(apiToken);
String answer = chatGpt.getChatCompletion(chat);

Message answerMessage = new Message(Author.Assistant, answer);
Expand All @@ -56,7 +59,15 @@ public class MainFragment extends Fragment {
getTextView().append(CHAT_SEPARATOR);
getTextView().append(toString(answerMessage));
scrollToEnd();
textToSpeech.speak(answer);


if (prefs.speakOutLoud()) {

textToSpeech.setLanguage(prefs.getLocale());

textToSpeech.speak(answer);

}
});
});
});
Expand All @@ -67,23 +78,38 @@ public MainFragment() {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_main, container, false);

return inflater.inflate(R.layout.fragment_main, container, false);
}


@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);

prefs = new PrefsFacade(requireContext());
textToSpeech = new TextToSpeechTool(requireContext(), Locale.GERMAN);


getContext().getResources().getConfiguration().setLocale(prefs.getLocale());

Locale.setDefault(prefs.getLocale());
Log.i("Test Main", Locale.getDefault()+"");

textToSpeech = new TextToSpeechTool(requireContext(), prefs.getLocale());

getAskButton().setOnClickListener(v ->
getTextFromSpeech.launch(new LaunchSpeechRecognition.SpeechRecognitionArgs(prefs.getLocale())));


chat = new Chat();
if (savedInstanceState != null) {
chat = savedInstanceState.getParcelable(EXTRA_DATA_CHAT);
}

getAskButton().setOnClickListener(v ->
getTextFromSpeech.launch(new LaunchSpeechRecognition.SpeechRecognitionArgs(Locale.GERMAN)));
getTextFromSpeech.launch(new LaunchSpeechRecognition.SpeechRecognitionArgs(prefs.getLocale())));
getResetButton().setOnClickListener(v -> {
textToSpeech.stop();
chat = new Chat();
updateTextView();
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package de.fhdw.app_entwicklung.chatgpt;

import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;

import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.ListPreference;
import androidx.preference.PreferenceFragmentCompat;

import java.util.Locale;

public class PrefsActivity extends AppCompatActivity {

@Override
Expand All @@ -20,11 +25,20 @@ protected void onCreate(Bundle savedInstanceState) {
.replace(R.id.settings, new SettingsFragment())
.commit();
}



ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
@Override
protected void attachBaseContext(Context newBase) {
newBase.getResources().getConfiguration().setLocale(Locale.getDefault());
Log.i("Test", Locale.getDefault()+"");
super.attachBaseContext(newBase);
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
Expand All @@ -39,6 +53,29 @@ public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);

ListPreference sprache = findPreference("language");
if (sprache != null){
sprache.setOnPreferenceChangeListener((preference, newValue) -> {
if (newValue == null || newValue.toString().isEmpty()){
return true;
}
Locale locale = Locale.forLanguageTag(newValue.toString());

if (locale == null){
return true;
}

Locale.setDefault(locale);

getContext().getApplicationContext().getResources().getConfiguration().setLocale(locale);
getActivity().recreate();
return true;


});

}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;

import java.util.Locale;

public class PrefsFacade {

private final Context context;
Expand All @@ -17,4 +19,30 @@ public String getApiToken() {
return PreferenceManager.getDefaultSharedPreferences(context).getString("api_token", "");
}

}

public boolean speakOutLoud() {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean("read_out_loud", true);
}

public Locale getLocale() {
String language = PreferenceManager.getDefaultSharedPreferences(context).getString("language", "en");
switch (language) {
case "de":
return Locale.GERMANY;
case "en":
return Locale.US;
case "chi":
return Locale.SIMPLIFIED_CHINESE;
case "jp":
return Locale.JAPAN;
case "ko":
return Locale.KOREA;
default:
throw new RuntimeException("Locale not supported: " + language);
}
}

public String getModel() {
return PreferenceManager.getDefaultSharedPreferences(context).getString("model_type", "gpt-3.5");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@
import de.fhdw.app_entwicklung.chatgpt.model.Chat;
import de.fhdw.app_entwicklung.chatgpt.model.Message;

public class ChatGpt implements IChatGpt {
public class ChatGpt{

private final String apiToken;

public ChatGpt(String apiToken) {
this.apiToken = apiToken;
}

@Override

public String getChatCompletion(@NonNull Chat chat) {
OpenAiService service = new OpenAiService(apiToken, Duration.ofSeconds(90));

Expand All @@ -34,7 +34,8 @@ public String getChatCompletion(@NonNull Chat chat) {
.map(this::toChatMessage)
.collect(Collectors.toList());
ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest.builder()
.model("gpt-3.5-turbo")
//Version auf gpt 4 geändert
.model("gpt-4")
.messages(messages)
.n(1)
.maxTokens(2048)
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,14 @@ public void destroy()
}
}

}
public void setLanguage(Locale locale) {
if (ttsAvailable) {
int result = textToSpeech.setLanguage(locale);
if (result == TextToSpeech.LANG_MISSING_DATA) {
Log.e("error", "TTS: Language data is missing.");
} else if (result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("error", "TTS: Language is not supported.");
}
}
}
}
Loading