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