Skip to content

Commit 5ecb266

Browse files
committed
Added Domain View
1 parent 01848c1 commit 5ecb266

16 files changed

Lines changed: 1229 additions & 16 deletions

File tree

.idea/misc.xml

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/de/rpicloud/ipv64net/helper/Extensions.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,44 @@ fun Date.formatGerman(): String {
1818
return format.format(this)
1919
}
2020

21+
fun Date.formatGermanTime(): String {
22+
val format = SimpleDateFormat("dd.MM.yyyy HH:mm:ss", Locale.GERMANY)
23+
return format.format(this)
24+
}
25+
2126
fun String.parseDbDate(): String {
2227
val dbFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US)
2328
val date: Date? = runCatching { dbFormat.parse(this) }.getOrNull()
2429
return date?.formatGerman() ?: "01.01.0001"
30+
}
31+
32+
fun String.parseDbDateTime(): String {
33+
val dbFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US)
34+
val date: Date? = runCatching { dbFormat.parse(this) }.getOrNull()
35+
return date?.formatGermanTime() ?: "01.01.0001 00:00:00"
36+
}
37+
38+
fun String.v64domains(): List<String> {
39+
return listOf(
40+
"ipv64.net",
41+
"ipv64.de",
42+
"any64.de",
43+
"api64.de",
44+
"dns64.de",
45+
"dyndns64.de",
46+
"eth64.de",
47+
"dynipv6.de",
48+
"home64.de",
49+
"iot64.de",
50+
"lan64.de",
51+
"nas64.de",
52+
"root64.de",
53+
"route64.de",
54+
"srv64.de",
55+
"tcp64.de",
56+
"udp64.de",
57+
"vpn64.de",
58+
"wan64.de",
59+
"Own Domain"
60+
)
2561
}

app/src/main/java/de/rpicloud/ipv64net/helper/NetworkService.kt

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ import android.content.Context
44
import android.util.Log
55
import com.google.gson.Gson
66
import de.rpicloud.ipv64net.models.AccountInfo
7+
import de.rpicloud.ipv64net.models.AddDomainResult
78
import de.rpicloud.ipv64net.models.DomainResult
9+
import de.rpicloud.ipv64net.models.IPResult
810
import de.rpicloud.ipv64net.models.IntegrationResult
911
import de.rpicloud.ipv64net.models.NetworkResult
1012
import de.rpicloud.ipv64net.models.parseDomainResult
@@ -14,9 +16,11 @@ import kotlinx.coroutines.withContext
1416
import okhttp3.Call
1517
import okhttp3.Dns
1618
import okhttp3.EventListener
19+
import okhttp3.FormBody
1720
import okhttp3.OkHttpClient
1821
import okhttp3.Protocol
1922
import okhttp3.Request
23+
import okhttp3.RequestBody
2024
import okhttp3.logging.HttpLoggingInterceptor
2125
import java.net.Inet4Address
2226
import java.net.Inet6Address
@@ -158,4 +162,155 @@ class NetworkService {
158162
}
159163
}
160164

165+
suspend fun GetMyIP(forV4: Boolean = true, callback: (result: NetworkResult) -> Unit) {
166+
167+
val url = if (forV4) "https://ipv4.ipv64.net/update.php?howismyip" else "https://ipv6.ipv64.net/update.php?howismyip"
168+
169+
withContext(Dispatchers.IO) {
170+
try {
171+
val gson = Gson()
172+
val request = Request.Builder()
173+
.url(url)
174+
.addHeader("Content-Type", "application/json; charset=utf-8")
175+
.addHeader("Accept", "application/json; charset=utf-8")
176+
.get()
177+
.build()
178+
179+
val response = OkHttpClientProvider.client.newCall(request).execute()
180+
val responseText = response.body.string()
181+
if (response.isSuccessful) {
182+
val result = gson.fromJson(responseText, IPResult::class.java)
183+
println("♻️ - ${result.ip}")
184+
callback(NetworkResult("Success", result, 200))
185+
} else {
186+
callback(NetworkResult("Fehler: ${response.code}", null, response.code))
187+
}
188+
} catch (e: Exception) {
189+
callback(NetworkResult(e.localizedMessage, null, 500))
190+
}
191+
}
192+
}
193+
194+
suspend fun PostNewDomain(domain: String, callback: (result: NetworkResult) -> Unit) {
195+
val url = baseUrl
196+
197+
val formBody = FormBody.Builder()
198+
.add("add_domain", domain)
199+
.build()
200+
201+
withContext(Dispatchers.IO) {
202+
try {
203+
val gson = Gson()
204+
205+
val request = Request.Builder()
206+
.url(url)
207+
.addHeader("Content-Type", "application/json; charset=utf-8")
208+
.addHeader("Accept", "application/json; charset=utf-8")
209+
.addHeader("Authorization", "Bearer $_apiToken")
210+
.post(formBody)
211+
.build()
212+
213+
val response = OkHttpClientProvider.client.newCall(request).execute()
214+
val responseText = response.body.string()
215+
if (response.isSuccessful) {
216+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
217+
withContext(Dispatchers.Main) {
218+
println("♻️ - ${result.add_domain}")
219+
callback(NetworkResult("Success", result, 200))
220+
}
221+
} else {
222+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
223+
withContext(Dispatchers.Main) {
224+
callback(NetworkResult("Fehler: ${response.code}", result, response.code))
225+
}
226+
}
227+
} catch (e: Exception) {
228+
withContext(Dispatchers.Main) {
229+
callback(NetworkResult(e.localizedMessage, null, 500))
230+
}
231+
}
232+
}
233+
}
234+
235+
suspend fun DeleteDomain(domain: String, callback: (result: NetworkResult) -> Unit) {
236+
val url = baseUrl
237+
238+
val formBody = FormBody.Builder()
239+
.add("del_domain", domain)
240+
.build()
241+
242+
withContext(Dispatchers.IO) {
243+
try {
244+
val gson = Gson()
245+
246+
val request = Request.Builder()
247+
.url(url)
248+
.addHeader("Content-Type", "application/json; charset=utf-8")
249+
.addHeader("Accept", "application/json; charset=utf-8")
250+
.addHeader("Authorization", "Bearer $_apiToken")
251+
.delete(formBody)
252+
.build()
253+
254+
val response = OkHttpClientProvider.client.newCall(request).execute()
255+
val responseText = response.body.string()
256+
if (response.isSuccessful) {
257+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
258+
withContext(Dispatchers.Main) {
259+
println("♻️ - ${result.add_domain}")
260+
callback(NetworkResult("Success", result, 200))
261+
}
262+
} else {
263+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
264+
withContext(Dispatchers.Main) {
265+
callback(NetworkResult("Fehler: ${response.code}", result, response.code))
266+
}
267+
}
268+
} catch (e: Exception) {
269+
withContext(Dispatchers.Main) {
270+
callback(NetworkResult(e.localizedMessage, null, 500))
271+
}
272+
}
273+
}
274+
}
275+
276+
suspend fun DeleteDNSRecord(recordId: Int, callback: (result: NetworkResult) -> Unit) {
277+
val url = baseUrl
278+
279+
val formBody = FormBody.Builder()
280+
.add("del_record", recordId.toString())
281+
.build()
282+
283+
withContext(Dispatchers.IO) {
284+
try {
285+
val gson = Gson()
286+
287+
val request = Request.Builder()
288+
.url(url)
289+
.addHeader("Content-Type", "application/json; charset=utf-8")
290+
.addHeader("Accept", "application/json; charset=utf-8")
291+
.addHeader("Authorization", "Bearer $_apiToken")
292+
.delete(formBody)
293+
.build()
294+
295+
val response = OkHttpClientProvider.client.newCall(request).execute()
296+
val responseText = response.body.string()
297+
if (response.isSuccessful) {
298+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
299+
withContext(Dispatchers.Main) {
300+
println("♻️ - ${result.add_domain}")
301+
callback(NetworkResult("Success", result, 200))
302+
}
303+
} else {
304+
val result = gson.fromJson(responseText, AddDomainResult::class.java)
305+
withContext(Dispatchers.Main) {
306+
callback(NetworkResult("Fehler: ${response.code}", result, response.code))
307+
}
308+
}
309+
} catch (e: Exception) {
310+
withContext(Dispatchers.Main) {
311+
callback(NetworkResult(e.localizedMessage, null, 500))
312+
}
313+
}
314+
}
315+
}
161316
}

app/src/main/java/de/rpicloud/ipv64net/main/activity/MainActivity.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import androidx.navigation.compose.NavHost
1818
import androidx.navigation.compose.composable
1919
import androidx.navigation.compose.currentBackStackEntryAsState
2020
import androidx.navigation.compose.rememberNavController
21+
import de.rpicloud.ipv64net.main.views.DomainDetailView
22+
import de.rpicloud.ipv64net.main.views.DomainNewView
2123
import de.rpicloud.ipv64net.main.views.DomainView
2224
import de.rpicloud.ipv64net.main.views.HealthcheckView
2325
import de.rpicloud.ipv64net.main.views.IntegrationsView
@@ -52,6 +54,12 @@ class MainActivity : ComponentActivity() {
5254
composable(Tabs.Companion.getRoute(Tab.settings)) {
5355
SettingsView(navController, mainPadding = mainPadding)
5456
}
57+
composable(Tabs.Companion.getRoute(Tab.domain_new)) {
58+
DomainNewView(navController, mainPadding = mainPadding)
59+
}
60+
composable(Tabs.Companion.getRoute(Tab.domain_details)) {
61+
DomainDetailView(navController, mainPadding = mainPadding)
62+
}
5563
}
5664
}
5765
}

0 commit comments

Comments
 (0)