diff --git a/.gitea/workflows/apk.yaml b/.gitea/workflows/apk.yaml
new file mode 100644
index 0000000..5ddefac
--- /dev/null
+++ b/.gitea/workflows/apk.yaml
@@ -0,0 +1,31 @@
+on:
+ push:
+ paths:
+ - dialer/**
+
+jobs:
+ build:
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v1
+ with:
+ subpath: dialer/
+ - uses: docker://git.gmoker.com/icing/flutter:main
+ - uses: actions/upload-artifact@v1
+ with:
+ name: icing-dialer-${{ gitea.ref_name }}-${{ gitea.run_id }}.apk
+ path: build/app/outputs/flutter-apk/app-release.apk
+
+ build-stealth:
+ runs-on: debian
+ steps:
+ - uses: actions/checkout@v1
+ with:
+ subpath: dialer/
+ - uses: docker://git.gmoker.com/icing/flutter:main
+ with:
+ args: "build apk --dart-define=STEALTH=true"
+ - uses: actions/upload-artifact@v1
+ with:
+ name: icing-dialer-stealth-${{ gitea.ref_name }}-${{ gitea.run_id }}.apk
+ path: build/app/outputs/flutter-apk/app-release.apk
diff --git a/.gitea/workflows/website.yaml b/.gitea/workflows/website.yaml
index 56d3687..9a4c6bd 100644
--- a/.gitea/workflows/website.yaml
+++ b/.gitea/workflows/website.yaml
@@ -6,11 +6,10 @@ on:
jobs:
deploy:
runs-on: debian
- defaults:
- run:
- working-directory: website
steps:
- uses: actions/checkout@v1
+ with:
+ subpath: website/
- name: setup env
run: |
. ./.env || true
@@ -29,10 +28,8 @@ jobs:
- uses: actions/kaniko@v1
with:
password: "${{ secrets.PKGRW }}"
- dockerfile: website/Dockerfile
- uses: actions/k8sdeploy@v1
with:
kubeconfig: "${{ secrets.K8S }}"
registry_password: "${{ secrets.PKGRW }}"
- workdir: website
diff --git a/README.md b/README.md
index ec30be8..76bb4d2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
# Icing
+## Encrypting phone calls on an analog audio level
+
An Epitech Innovation Project
*By*
@@ -8,6 +10,12 @@ An Epitech Innovation Project
---
The **docs** folder contains documentation about:
+
+#### Epitech
+- The Beta Test Plan
+- The Delivrables
+
+#### Icing
- The project
- A user manual
- Our automations
diff --git a/dialer/android/.gitignore b/dialer/android/.gitignore
index e409267..e6d71b3 100644
--- a/dialer/android/.gitignore
+++ b/dialer/android/.gitignore
@@ -4,6 +4,7 @@ gradle-wrapper.jar
/gradlew
/gradlew.bat
/local.properties
+/gradle.properties
GeneratedPluginRegistrant.java
gradle.properties
diff --git a/dialer/android/app/src/main/AndroidManifest.xml b/dialer/android/app/src/main/AndroidManifest.xml
index cb4976e..e0de6a4 100644
--- a/dialer/android/app/src/main/AndroidManifest.xml
+++ b/dialer/android/app/src/main/AndroidManifest.xml
@@ -5,13 +5,17 @@
+
+
+
+
- // Delegate method calls to KeystoreHelper
- KeystoreHelper(call, result).handleMethodCall()
- }
- }
-}
diff --git a/dialer/android/app/src/main/kotlin/com/icing/dialer/activities/MainActivity.kt b/dialer/android/app/src/main/kotlin/com/icing/dialer/activities/MainActivity.kt
new file mode 100644
index 0000000..a2397d6
--- /dev/null
+++ b/dialer/android/app/src/main/kotlin/com/icing/dialer/activities/MainActivity.kt
@@ -0,0 +1,94 @@
+package com.icing.dialer.activities
+
+import android.database.Cursor
+import android.os.Bundle
+import android.provider.CallLog
+import io.flutter.embedding.android.FlutterActivity
+import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+import com.icing.dialer.KeystoreHelper
+import com.icing.dialer.services.CallService
+
+class MainActivity: FlutterActivity() {
+ // Existing channel for keystore operations.
+ private val KEYSTORE_CHANNEL = "com.example.keystore"
+ // New channel for call log access.
+ private val CALLLOG_CHANNEL = "com.example.calllog"
+
+ private val CALL_CHANNEL = "call_service"
+
+ override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
+ super.configureFlutterEngine(flutterEngine)
+
+ // Call service channel
+ MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CALL_CHANNEL).setMethodCallHandler { call, result ->
+ when (call.method) {
+ "makeGsmCall" -> {
+ val phoneNumber = call.argument("phoneNumber")
+ if (phoneNumber != null) {
+ CallService.makeGsmCall(this, phoneNumber)
+ result.success("Calling $phoneNumber")
+ } else {
+ result.error("INVALID_PHONE_NUMBER", "Phone number is required", null)
+ }
+ }
+ "hangUpCall" -> {
+ CallService.hangUpCall(this)
+ result.success("Call ended")
+ }
+ else -> result.notImplemented()
+ }
+ }
+
+ // Set up the keystore channel.
+ MethodChannel(flutterEngine.dartExecutor.binaryMessenger, KEYSTORE_CHANNEL)
+ .setMethodCallHandler { call, result ->
+ // Delegate method calls to KeystoreHelper.
+ KeystoreHelper(call, result).handleMethodCall()
+ }
+
+ // Set up the call log channel.
+ MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CALLLOG_CHANNEL)
+ .setMethodCallHandler { call, result ->
+ if (call.method == "getCallLogs") {
+ val callLogs = getCallLogs()
+ result.success(callLogs)
+ } else {
+ result.notImplemented()
+ }
+ }
+ }
+
+ /**
+ * Queries the Android call log and returns a list of maps.
+ * Each map contains keys: "number", "type", "date", and "duration".
+ */
+ private fun getCallLogs(): List