>) {
+ fileChooserCallback = callback
+
+ val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).also {
+ val photoFile = createTempImageFile()
+ cameraImageUri = FileProvider.getUriForFile(this, "$packageName.fileprovider", photoFile)
+ it.putExtra(MediaStore.EXTRA_OUTPUT, cameraImageUri)
+ }
+
+ val galleryIntent = Intent(Intent.ACTION_GET_CONTENT).apply {
+ type = "*/*"
+ putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/*", "video/*", "application/pdf", "*/*"))
+ putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
+ }
+
+ filePickerLauncher.launch(
+ Intent.createChooser(galleryIntent, getString(R.string.chooser_title)).apply {
+ putExtra(Intent.EXTRA_INITIAL_INTENTS, arrayOf(cameraIntent))
+ }
+ )
+ }
+
+ private fun createTempImageFile(): File {
+ val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
+ val dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
+ return File.createTempFile("IMG_${timestamp}_", ".jpg", dir)
+ }
+
+ private fun errorPage(message: String) = """
+
+ Не удалось подключиться
+ $message
+ При следующем запуске будет запрошен адрес сервера
+
+ """.trimIndent()
+
+ override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
+ if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) {
+ webView.goBack()
+ return true
+ }
+ return super.onKeyDown(keyCode, event)
+ }
+}
diff --git a/android-client/app/src/main/java/com/navi/client/SetupActivity.kt b/android-client/app/src/main/java/com/navi/client/SetupActivity.kt
new file mode 100644
index 0000000..8634cbb
--- /dev/null
+++ b/android-client/app/src/main/java/com/navi/client/SetupActivity.kt
@@ -0,0 +1,40 @@
+package com.navi.client
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Button
+import android.widget.EditText
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+
+class SetupActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_setup)
+
+ val prefs = getSharedPreferences("navi", Context.MODE_PRIVATE)
+ val urlField = findViewById(R.id.et_server_url)
+ val saveButton = findViewById