diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts new file mode 100644 index 0000000..b69c46e --- /dev/null +++ b/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("org.jetbrains.kotlin.android") +} + +android { + namespace = "com.schoolmesh.messenger" + compileSdk = 34 + + defaultConfig { + applicationId = "com.schoolmesh.messenger" + minSdk = 26 + targetSdk = 34 + versionCode = 2 + versionName = "0.1.1" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } +} + +dependencies { + implementation("androidx.core:core-ktx:1.13.1") + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.1.4") +} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..634a9fa --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1 @@ +# Project specific ProGuard rules go here. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9825773 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/com/schoolmesh/messenger/MainActivity.kt b/android/app/src/main/java/com/schoolmesh/messenger/MainActivity.kt new file mode 100644 index 0000000..0daaf99 --- /dev/null +++ b/android/app/src/main/java/com/schoolmesh/messenger/MainActivity.kt @@ -0,0 +1,165 @@ +package com.schoolmesh.messenger + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Build +import android.os.Bundle +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat +import com.schoolmesh.messenger.mesh.MeshForegroundService +import com.schoolmesh.messenger.mesh.MeshServiceContract + +class MainActivity : AppCompatActivity() { + private lateinit var statusText: TextView + private lateinit var peersText: TextView + private lateinit var logsText: TextView + + private val peers = linkedSetOf() + private val logs = ArrayDeque() + + private val meshEventReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (intent?.action != MeshServiceContract.ACTION_EVENT) return + val eventType = intent.getStringExtra(MeshServiceContract.EXTRA_EVENT_TYPE) ?: return + val value = intent.getStringExtra(MeshServiceContract.EXTRA_EVENT_VALUE) ?: return + + when (eventType) { + MeshServiceContract.EVENT_STATUS -> updateStatus(value) + MeshServiceContract.EVENT_PEER -> addPeer(value) + MeshServiceContract.EVENT_LOG -> appendLog(value) + } + } + } + + private val permissionLauncher = registerForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { result -> + val allGranted = result.values.all { it } + if (allGranted) { + startMesh() + } else { + updateStatus("Нет BLE-разрешений") + appendLog("Permissions denied by user") + Toast.makeText(this, "Разрешения отклонены", Toast.LENGTH_SHORT).show() + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + statusText = findViewById(R.id.statusText) + peersText = findViewById(R.id.peersText) + logsText = findViewById(R.id.logsText) + + findViewById