diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml
index 45126ce3..c5e7e483 100644
--- a/.github/workflows/android.yml
+++ b/.github/workflows/android.yml
@@ -13,10 +13,10 @@ jobs:
steps:
- uses: actions/checkout@v3
- - name: set up JDK 11
+ - name: set up JDK 17
uses: actions/setup-java@v3
with:
- java-version: '11'
+ java-version: '17'
distribution: 'temurin'
cache: gradle
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..ed48f22d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+# Activity #3
+
+### Задание #1
+В классе **EditProfileActivity** по клику на `ImageView` с `id=imageview_photo` покажите Alert Dialog с выбором действия. Используйте реализацию диалога указанную в [примере](https://material.io/components/dialogs/android#simple-dialog), в качестве элементов массива добавьте элементы “Сделать фото” и “Выбрать фото”
+
+По клику на кнопку Сделать фото запросите у пользователя Runtime Permission на использование камеры. Обработайте следующие возможные сценарии:
+
+1. Пользователя выдал разрешение на использование камеры → отобразите в ImageView ресурс `R.drawable.cat`
+2. Пользователь не разрешил использовать камеру первый раз → ничего не делаем
+3. Пользователь еще раз запросил разрешение на использование камеры после отмены → покажите Rationale Dialog, и объясните зачем вам камера
+
+ В качестве реализации Rationale Dialog используйте [простой Alert Dialog](https://material.io/components/dialogs/android#alert-dialog) с двумя кнопками: “Дать доступ” и “Отмена”. По клику на кнопку “Дать доступ” повторно запросите разрешение, по клику на кнопку “Отмена” закройте диалоговое окно
+
+4. Пользователь повторно запретил использовать камеру → Покажите диалоговое окно с одной кнопкой → “Открыть настройки”. По клику на кнопку отправьте пользователя в настройки приложения, с возможностью поменять разрешение
+
+> 💡 В этом задании вам не нужно использовать какое либо кеширование/флаги и прочее. Реализуйте все с использованием ResultApi и методов Activity
+
+### Задание #2
+По клику на кнопку “Выбрать фото” откройте экран выбора фото из галлереи, после того как вы получите URI фотографии в `ActivityResultCallback` вызовите метод `populateImage`, чтобы отобразить полученную фотографию в ImageView
+
+> 💡 Используйте готовый контракт из класса `ActivityResultContracts` для открытия пикера медиафайлов
+
+
+
+### Задание #3
+1. Создайте класс-наследник Activity **FillFormActivity** и добавьте в нее 3 EditText для ввода имени, фамилии и возраста, и кнопку “Применить”
+2. В **EditProfileActivity** по клику на кнопку “Редактировать профиль” откройте **FillFormActivity** с запросом результата, используя ResultApi
+3. По нажатию на кнопку “Применить” на **FillFormActivity** заберите введенный текст из 3 полей и отправьте результат на запустившую ее Activity, тоесть на **EditProfileActivity**
+4. В **EditProfileActivity** обработайте полученный результат и отобразите контент в соответствующих TextView
+5. Реализуйте функцию `openSenderApp` так, чтобы она отправляла явный интент в Telegram, в качестве extras отправьте картинку полученную из галлереи и контент TextView
+
+
diff --git a/app/build.gradle b/app/build.gradle
index 07e82a52..cb88cfdc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id("io.gitlab.arturbosch.detekt")
+ id 'kotlin-parcelize'
}
android {
@@ -43,8 +44,8 @@ detekt {
tasks.named("detekt").configure {
reports {
- txt.required.set(true)
- html.required.set(false)
+ txt.required.set(false)
+ html.required.set(true)
md.required.set(false)
xml.required.set(false)
sarif.required.set(false)
@@ -56,4 +57,8 @@ dependencies {
implementation 'androidx.core:core-ktx:1.13.1'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.12.0'
+ implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
+ implementation 'androidx.activity:activity-ktx:1.9.0'
+ implementation 'androidx.fragment:fragment-ktx:1.7.1'
+ implementation 'com.squareup.picasso:picasso:2.71828'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 811aafa1..852ca6d0 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,6 +2,12 @@
+
+
+
+
+ tools:targetApi="31">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt
new file mode 100644
index 00000000..e2134894
--- /dev/null
+++ b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt
@@ -0,0 +1,167 @@
+package otus.gpb.homework.activities
+
+import android.Manifest
+import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.graphics.BitmapFactory
+import android.net.Uri
+import android.os.Bundle
+import android.provider.Settings
+import android.widget.Button
+import android.widget.ImageView
+import android.widget.TextView
+import android.widget.Toast
+import android.widget.Toast.LENGTH_SHORT
+import androidx.activity.result.contract.ActivityResultContracts
+import androidx.appcompat.app.AlertDialog
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.Toolbar
+
+class EditProfileActivity : AppCompatActivity() {
+
+ private val requestCameraPermission = registerForActivityResult(
+ ActivityResultContracts
+ .RequestPermission()
+ )
+ { granted ->
+ when {
+ granted -> imageView.setImageResource(R.drawable.cat)
+ shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> showRationalDialog()
+ else -> showSettingsDialog()
+ }
+ }
+
+ private val imageContent = registerForActivityResult(ActivityResultContracts.GetContent())
+ {
+ it?.let {
+ profileImageUri = it
+ populateImage(it)
+ }
+ }
+
+ private val launcherProfileContract = registerForActivityResult(ProfileContractActivity())
+ { result ->
+ profile = result
+ findViewById(R.id.textview_name).text = result?.name
+ findViewById(R.id.textview_surname).text = result?.surname
+ findViewById(R.id.textview_age).text = result?.age
+ }
+
+ private var profile: Profile? = null
+ private var profileImageUri: Uri? = null
+ private lateinit var imageView: ImageView
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_edit_profile)
+ imageView = findViewById(R.id.imageview_photo)
+
+ findViewById(R.id.toolbar).apply {
+ inflateMenu(R.menu.menu)
+ setOnMenuItemClickListener {
+ when (it.itemId) {
+ R.id.send_item -> {
+ openSenderApp()
+ true
+ }
+
+ else -> false
+ }
+ }
+ }
+
+ imageView.setOnClickListener {
+ showSelectPictureAlert()
+ }
+
+ findViewById