v1-t
parent
04e67441b3
commit
f13ba6fa70
|
@ -305,7 +305,7 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation Deps.mozilla_browser_engine_gecko
|
implementation Deps.mozilla_browser_engine_gecko
|
||||||
|
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
|
||||||
implementation Deps.kotlin_stdlib
|
implementation Deps.kotlin_stdlib
|
||||||
implementation Deps.kotlin_coroutines
|
implementation Deps.kotlin_coroutines
|
||||||
implementation Deps.kotlin_coroutines_android
|
implementation Deps.kotlin_coroutines_android
|
||||||
|
|
|
@ -0,0 +1,214 @@
|
||||||
|
From 04e67441b3f04ce1a005843527be7ae3ba3597fc Mon Sep 17 00:00:00 2001
|
||||||
|
From: harvey186 <harvey186@hotmail.com>
|
||||||
|
Date: Mon, 10 Mar 2025 12:00:34 +0100
|
||||||
|
Subject: [PATCH] x
|
||||||
|
|
||||||
|
---
|
||||||
|
.../android/ui/robots/SettingsRobot.kt | 4 +-
|
||||||
|
.../java/net/waterfox/android/MainActivity.kt | 24 ++++++++
|
||||||
|
.../android/network/OkHttpClientProvider.kt | 60 +++++++++++++++++++
|
||||||
|
.../android/repository/NetworkRepository.kt | 24 ++++++++
|
||||||
|
.../android/viewmodel/MainViewModel.kt | 17 ++++++
|
||||||
|
app/src/main/res/layout/activity_main.xml | 15 +++++
|
||||||
|
6 files changed, 142 insertions(+), 2 deletions(-)
|
||||||
|
create mode 100644 app/src/main/java/net/waterfox/android/MainActivity.kt
|
||||||
|
create mode 100644 app/src/main/java/net/waterfox/android/network/OkHttpClientProvider.kt
|
||||||
|
create mode 100644 app/src/main/java/net/waterfox/android/repository/NetworkRepository.kt
|
||||||
|
create mode 100644 app/src/main/java/net/waterfox/android/viewmodel/MainViewModel.kt
|
||||||
|
create mode 100644 app/src/main/res/layout/activity_main.xml
|
||||||
|
|
||||||
|
diff --git a/app/src/androidTest/java/net/waterfox/android/ui/robots/SettingsRobot.kt b/app/src/androidTest/java/net/waterfox/android/ui/robots/SettingsRobot.kt
|
||||||
|
index 47afad4..1d4df12 100644
|
||||||
|
--- a/app/src/androidTest/java/net/waterfox/android/ui/robots/SettingsRobot.kt
|
||||||
|
+++ b/app/src/androidTest/java/net/waterfox/android/ui/robots/SettingsRobot.kt
|
||||||
|
@@ -106,7 +106,7 @@ class SettingsRobot {
|
||||||
|
// ABOUT SECTION
|
||||||
|
fun verifyAboutHeading() = assertAboutHeading()
|
||||||
|
|
||||||
|
- fun verifyRateOnGooglePlay() = assertTrue(rateOnGooglePlayHeading().waitForExists(waitingTime))
|
||||||
|
+// fun verifyRateOnGooglePlay() = assertTrue(rateOnGooglePlayHeading().waitForExists(waitingTime))
|
||||||
|
fun verifyAboutWaterfoxPreview() = assertTrue(aboutWaterfoxHeading().waitForExists(waitingTime))
|
||||||
|
fun verifyGooglePlayRedirect() = assertGooglePlayRedirect()
|
||||||
|
|
||||||
|
@@ -561,7 +561,7 @@ private fun assertAboutHeading(): ViewInteraction {
|
||||||
|
// settingsList().scrollToEnd(LISTS_MAXSWIPES)
|
||||||
|
// rateOnGooglePlay.waitForExists(waitingTime)
|
||||||
|
|
||||||
|
- return rateOnGooglePlay//
|
||||||
|
+// return rateOnGooglePlay//
|
||||||
|
//}
|
||||||
|
|
||||||
|
private fun aboutWaterfoxHeading(): UiObject {
|
||||||
|
diff --git a/app/src/main/java/net/waterfox/android/MainActivity.kt b/app/src/main/java/net/waterfox/android/MainActivity.kt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..cddf760
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/app/src/main/java/net/waterfox/android/MainActivity.kt
|
||||||
|
@@ -0,0 +1,24 @@
|
||||||
|
+package net.waterfox.android
|
||||||
|
+
|
||||||
|
+import android.os.Bundle
|
||||||
|
+import android.widget.Toast
|
||||||
|
+import androidx.appcompat.app.AppCompatActivity
|
||||||
|
+import net.waterfox.android.network.OkHttpClientProvider
|
||||||
|
+
|
||||||
|
+class MainActivity : AppCompatActivity() {
|
||||||
|
+
|
||||||
|
+ override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
|
+ super.onCreate(savedInstanceState)
|
||||||
|
+ setContentView(R.layout.activity_main)
|
||||||
|
+
|
||||||
|
+ // Beispiel-URL, die abgefragt wird
|
||||||
|
+ val url = "https://detectportal.firefox.com" // Dies wird blockiert
|
||||||
|
+
|
||||||
|
+ // Anfrage senden
|
||||||
|
+ val response = OkHttpClientProvider.makeRequest(url)
|
||||||
|
+
|
||||||
|
+ // Antwort anzeigen
|
||||||
|
+ Toast.makeText(this, "Antwort: $response", Toast.LENGTH_LONG).show()
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/app/src/main/java/net/waterfox/android/network/OkHttpClientProvider.kt b/app/src/main/java/net/waterfox/android/network/OkHttpClientProvider.kt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..9862a0f
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/app/src/main/java/net/waterfox/android/network/OkHttpClientProvider.kt
|
||||||
|
@@ -0,0 +1,60 @@
|
||||||
|
+package net.waterfox.android.network
|
||||||
|
+
|
||||||
|
+import okhttp3.OkHttpClient
|
||||||
|
+import okhttp3.Request
|
||||||
|
+import okhttp3.Interceptor
|
||||||
|
+import okhttp3.Response
|
||||||
|
+import java.io.IOException
|
||||||
|
+
|
||||||
|
+object OkHttpClientProvider {
|
||||||
|
+
|
||||||
|
+ // Interceptor, der Domains blockiert
|
||||||
|
+ private val blockDomainInterceptor = Interceptor { chain ->
|
||||||
|
+ val request = chain.request()
|
||||||
|
+
|
||||||
|
+ // Logge die URL der Anfrage
|
||||||
|
+ println("Intercepting request to: ${request.url.host}")
|
||||||
|
+
|
||||||
|
+ // Hier kannst du Domains definieren, die blockiert werden sollen
|
||||||
|
+ val blockedDomains = listOf("detectportal.firefox.com", "content-signature-2.cdn.mozilla.net")
|
||||||
|
+
|
||||||
|
+ // Logge, ob die Domain blockiert werden soll
|
||||||
|
+ if (blockedDomains.any { request.url.host.contains(it) }) {
|
||||||
|
+ println("BLOCKING DOMAIN: ${request.url.host}")
|
||||||
|
+ // Wenn die Domain blockiert werden soll, gib eine Fehlerantwort zurück
|
||||||
|
+ throw IOException("Blocked domain: ${request.url.host}")
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Ansonsten fahre mit der Anfrage fort
|
||||||
|
+ println("Request allowed to proceed: ${request.url.host}")
|
||||||
|
+ return@Interceptor chain.proceed(request)
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Erstelle einen OkHttpClient mit dem BlockDomainInterceptor
|
||||||
|
+ fun getOkHttpClient(): OkHttpClient {
|
||||||
|
+ return OkHttpClient.Builder()
|
||||||
|
+ .addInterceptor(blockDomainInterceptor) // Hier fügen wir den Interceptor hinzu
|
||||||
|
+ .build()
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // Beispiel für eine einfache Anfrage
|
||||||
|
+ fun makeRequest(url: String): String {
|
||||||
|
+ val client = getOkHttpClient()
|
||||||
|
+ val request = Request.Builder()
|
||||||
|
+ .url(url)
|
||||||
|
+ .build()
|
||||||
|
+
|
||||||
|
+ return try {
|
||||||
|
+ // Führe die Anfrage aus
|
||||||
|
+ val response = client.newCall(request).execute()
|
||||||
|
+ // Logge die Antwort
|
||||||
|
+ println("Antwort: ${response.body?.string()}")
|
||||||
|
+ response.body?.string() ?: "Leere Antwort"
|
||||||
|
+ } catch (e: Exception) {
|
||||||
|
+ // Fehlerbehandlung, wenn eine Ausnahme auftritt
|
||||||
|
+ println("Fehler: ${e.message}")
|
||||||
|
+ return "Fehler: ${e.message}"
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/app/src/main/java/net/waterfox/android/repository/NetworkRepository.kt b/app/src/main/java/net/waterfox/android/repository/NetworkRepository.kt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..b1118ba
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/app/src/main/java/net/waterfox/android/repository/NetworkRepository.kt
|
||||||
|
@@ -0,0 +1,24 @@
|
||||||
|
+package net.waterfox.android.repository
|
||||||
|
+
|
||||||
|
+import okhttp3.OkHttpClient
|
||||||
|
+import okhttp3.Request
|
||||||
|
+import okhttp3.Response
|
||||||
|
+import net.waterfox.android.network.OkHttpClientProvider
|
||||||
|
+
|
||||||
|
+class NetworkRepository {
|
||||||
|
+
|
||||||
|
+ // Diese Funktion holt Daten von einer angegebenen URL
|
||||||
|
+ fun fetchData(url: String): String {
|
||||||
|
+ try {
|
||||||
|
+ val client: OkHttpClient = OkHttpClientProvider.getOkHttpClient()
|
||||||
|
+ val request = Request.Builder().url(url).build()
|
||||||
|
+ val response: Response = client.newCall(request).execute()
|
||||||
|
+
|
||||||
|
+ // Gib den Antworttext zurück
|
||||||
|
+ return response.body?.string() ?: "No Data"
|
||||||
|
+ } catch (e: Exception) {
|
||||||
|
+ return "Fehler: ${e.message}"
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/app/src/main/java/net/waterfox/android/viewmodel/MainViewModel.kt b/app/src/main/java/net/waterfox/android/viewmodel/MainViewModel.kt
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..e835966
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/app/src/main/java/net/waterfox/android/viewmodel/MainViewModel.kt
|
||||||
|
@@ -0,0 +1,17 @@
|
||||||
|
+package net.waterfox.android.viewmodel
|
||||||
|
+
|
||||||
|
+import androidx.lifecycle.ViewModel
|
||||||
|
+import androidx.lifecycle.liveData
|
||||||
|
+import net.waterfox.android.repository.NetworkRepository
|
||||||
|
+
|
||||||
|
+class MainViewModel : ViewModel() {
|
||||||
|
+
|
||||||
|
+ private val repository = NetworkRepository() // Instanz des Repositories erstellen
|
||||||
|
+
|
||||||
|
+ // Funktion, die die LiveData von der Netzwerkanfrage liefert
|
||||||
|
+ fun fetchData(url: String) = liveData {
|
||||||
|
+ val data = repository.fetchData(url) // Netzwerkoperation aufrufen
|
||||||
|
+ emit(data) // LiveData mit dem Ergebnis versorgen
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..b30d715
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/app/src/main/res/layout/activity_main.xml
|
||||||
|
@@ -0,0 +1,15 @@
|
||||||
|
+<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
+ android:layout_width="match_parent"
|
||||||
|
+ android:layout_height="match_parent"
|
||||||
|
+ android:orientation="vertical">
|
||||||
|
+
|
||||||
|
+ <TextView
|
||||||
|
+ android:id="@+id/textView"
|
||||||
|
+ android:layout_width="wrap_content"
|
||||||
|
+ android:layout_height="wrap_content"
|
||||||
|
+ android:text="Hello, World!"
|
||||||
|
+ android:textSize="18sp" />
|
||||||
|
+
|
||||||
|
+</LinearLayout>
|
||||||
|
+
|
||||||
|
--
|
||||||
|
2.34.1
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
// Autoconfig für GeckoView (optional)
|
||||||
|
|
||||||
|
pref("network.trr.mode", 2);
|
||||||
|
pref("network.trr.uri", "https://example.doh.server/dns-query");
|
||||||
|
pref("network.trr.use_ohttp", true);
|
||||||
|
pref("network.trr.ohttp.config_uri", "https://your-config-uri.com/.well-known/doohconfig");
|
||||||
|
|
||||||
|
pref("contentblocking.features.enabled", true);
|
||||||
|
pref("contentblocking.policy", 1);
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
prefs:
|
# Geckoview Config - Aktivierung von DNS-over-HTTPS und Content Blocking
|
||||||
network.trr.mode: 0
|
|
||||||
network.trr.ohttp.config_uri: "https://dooh.quad9.com/.well-known/doohconfig"
|
network.trr.mode: 2 # Aktiviert DNS-over-HTTPS
|
||||||
network.trr.ohttp.uri: "https://dooh.quad9/dns-query"
|
network.trr.uri: "https://example.doh.server/dns-query" # Dein DoH-Server
|
||||||
network.trr.ohttp.relay_uri: "https://dooh.waterfox.net/"
|
network.trr.use_ohttp: true # Benutzt DoH-Over-HTTP (OHTTP)
|
||||||
network.trr.use_ohttp: true
|
network.trr.ohttp.config_uri: "https://your-config-uri.com/.well-known/doohconfig"
|
||||||
|
|
||||||
|
# Aktiviert Content-Blocking
|
||||||
|
contentblocking.features.enabled: true
|
||||||
|
contentblocking.policy: 1 # Blockiert Werbung und Tracker
|
||||||
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
package net.waterfox.android
|
|
||||||
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.widget.Toast
|
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
|
||||||
import net.waterfox.android.network.OkHttpClientProvider
|
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity() {
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
|
||||||
super.onCreate(savedInstanceState)
|
|
||||||
setContentView(R.layout.activity_main)
|
|
||||||
|
|
||||||
// Beispiel-URL, die abgefragt wird
|
|
||||||
val url = "https://detectportal.firefox.com" // Dies wird blockiert
|
|
||||||
|
|
||||||
// Anfrage senden
|
|
||||||
val response = OkHttpClientProvider.makeRequest(url)
|
|
||||||
|
|
||||||
// Antwort anzeigen
|
|
||||||
Toast.makeText(this, "Antwort: $response", Toast.LENGTH_LONG).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,60 +0,0 @@
|
||||||
package net.waterfox.android.network
|
|
||||||
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.Interceptor
|
|
||||||
import okhttp3.Response
|
|
||||||
import java.io.IOException
|
|
||||||
|
|
||||||
object OkHttpClientProvider {
|
|
||||||
|
|
||||||
// Interceptor, der Domains blockiert
|
|
||||||
private val blockDomainInterceptor = Interceptor { chain ->
|
|
||||||
val request = chain.request()
|
|
||||||
|
|
||||||
// Logge die URL der Anfrage
|
|
||||||
println("Intercepting request to: ${request.url.host}")
|
|
||||||
|
|
||||||
// Hier kannst du Domains definieren, die blockiert werden sollen
|
|
||||||
val blockedDomains = listOf("detectportal.firefox.com", "content-signature-2.cdn.mozilla.net")
|
|
||||||
|
|
||||||
// Logge, ob die Domain blockiert werden soll
|
|
||||||
if (blockedDomains.any { request.url.host.contains(it) }) {
|
|
||||||
println("BLOCKING DOMAIN: ${request.url.host}")
|
|
||||||
// Wenn die Domain blockiert werden soll, gib eine Fehlerantwort zurück
|
|
||||||
throw IOException("Blocked domain: ${request.url.host}")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ansonsten fahre mit der Anfrage fort
|
|
||||||
println("Request allowed to proceed: ${request.url.host}")
|
|
||||||
return@Interceptor chain.proceed(request)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Erstelle einen OkHttpClient mit dem BlockDomainInterceptor
|
|
||||||
fun getOkHttpClient(): OkHttpClient {
|
|
||||||
return OkHttpClient.Builder()
|
|
||||||
.addInterceptor(blockDomainInterceptor) // Hier fügen wir den Interceptor hinzu
|
|
||||||
.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Beispiel für eine einfache Anfrage
|
|
||||||
fun makeRequest(url: String): String {
|
|
||||||
val client = getOkHttpClient()
|
|
||||||
val request = Request.Builder()
|
|
||||||
.url(url)
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return try {
|
|
||||||
// Führe die Anfrage aus
|
|
||||||
val response = client.newCall(request).execute()
|
|
||||||
// Logge die Antwort
|
|
||||||
println("Antwort: ${response.body?.string()}")
|
|
||||||
response.body?.string() ?: "Leere Antwort"
|
|
||||||
} catch (e: Exception) {
|
|
||||||
// Fehlerbehandlung, wenn eine Ausnahme auftritt
|
|
||||||
println("Fehler: ${e.message}")
|
|
||||||
return "Fehler: ${e.message}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
package net.waterfox.android.repository
|
|
||||||
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.Request
|
|
||||||
import okhttp3.Response
|
|
||||||
import net.waterfox.android.network.OkHttpClientProvider
|
|
||||||
|
|
||||||
class NetworkRepository {
|
|
||||||
|
|
||||||
// Diese Funktion holt Daten von einer angegebenen URL
|
|
||||||
fun fetchData(url: String): String {
|
|
||||||
try {
|
|
||||||
val client: OkHttpClient = OkHttpClientProvider.getOkHttpClient()
|
|
||||||
val request = Request.Builder().url(url).build()
|
|
||||||
val response: Response = client.newCall(request).execute()
|
|
||||||
|
|
||||||
// Gib den Antworttext zurück
|
|
||||||
return response.body?.string() ?: "No Data"
|
|
||||||
} catch (e: Exception) {
|
|
||||||
return "Fehler: ${e.message}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
package net.waterfox.android.viewmodel
|
|
||||||
|
|
||||||
import androidx.lifecycle.ViewModel
|
|
||||||
import androidx.lifecycle.liveData
|
|
||||||
import net.waterfox.android.repository.NetworkRepository
|
|
||||||
|
|
||||||
class MainViewModel : ViewModel() {
|
|
||||||
|
|
||||||
private val repository = NetworkRepository() // Instanz des Repositories erstellen
|
|
||||||
|
|
||||||
// Funktion, die die LiveData von der Netzwerkanfrage liefert
|
|
||||||
fun fetchData(url: String) = liveData {
|
|
||||||
val data = repository.fetchData(url) // Netzwerkoperation aufrufen
|
|
||||||
emit(data) // LiveData mit dem Ergebnis versorgen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/textView"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Hello, World!"
|
|
||||||
android:textSize="18sp" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
Loading…
Reference in New Issue