diff --git a/app/build.gradle b/app/build.gradle index 57688408..0b8d43c8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,8 +4,9 @@ plugins { id("io.gitlab.arturbosch.detekt") } + android { - compileSdk 34 + compileSdk 36 defaultConfig { applicationId "otus.gpb.homework.activities" @@ -57,7 +58,8 @@ dependencies { 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' + implementation 'androidx.activity:activity-ktx:1.8.0' + implementation 'androidx.activity:activity:1.8.0' } \ No newline at end of file diff --git a/app/release/baselineProfiles/0/app-release.dm b/app/release/baselineProfiles/0/app-release.dm new file mode 100644 index 00000000..b91332f3 Binary files /dev/null and b/app/release/baselineProfiles/0/app-release.dm differ diff --git a/app/release/baselineProfiles/1/app-release.dm b/app/release/baselineProfiles/1/app-release.dm new file mode 100644 index 00000000..35292f9f Binary files /dev/null and b/app/release/baselineProfiles/1/app-release.dm differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e3d3319b..0e07166b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,13 @@ + + + + + - - + + + + + + + \ 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 index d55ee922..a3e243fc 100644 --- a/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt +++ b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt @@ -1,14 +1,112 @@ package otus.gpb.homework.activities +import android.Manifest +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.graphics.drawable.BitmapDrawable import android.net.Uri import android.os.Bundle +import android.os.Environment +import android.provider.MediaStore +import android.provider.Settings +import android.util.Log +import android.widget.Button +import android.widget.EditText import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar +import androidx.core.content.FileProvider +import androidx.core.net.toUri +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.FileOutputStream class EditProfileActivity : AppCompatActivity() { + private val launchPermissionCamera = registerForActivityResult( + ActivityResultContracts.RequestPermission() + ) { isGranted -> + when (isGranted) { + // Разрешение получено - показываем кота + true -> findViewById(R.id.imageview_photo).setImageResource(R.drawable.cat) + // Разрешение не получено + false -> if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { + // Отображаем диалог с обоснованием перед запросом разрешения + showRationaleDialog() + } else { + showOpenSettingsDialog() + } + } + } + + private val launcherGetPicture = registerForActivityResult( + ActivityResultContracts.GetContent() + ) { image -> + if (image != null) { + //findViewById(R.id.imageview_photo).setImageURI(image) + populateImage(image) + } + } + + private val launcherFillFormActivity = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + when (result.resultCode) { + RESULT_OK -> { + val data = result.data + if (data != null) { + val name = data.getStringExtra("name") ?: "" + val surname = data.getStringExtra("surname") ?: "" + val age = data.getIntExtra("age", 0) + + findViewById(R.id.textview_name).text = name + findViewById(R.id.textview_surname).text = surname + findViewById(R.id.textview_age).text = age.toString() + } + } + + RESULT_CANCELED -> { + Toast.makeText(this, "Галя, у нас отмена!", Toast.LENGTH_SHORT).show() + } + } + } + + private fun showRationaleDialog() { + MaterialAlertDialogBuilder(this) + .setTitle("Нужен доступ к камере") + .setMessage("Для создания фотографии профиля необходимо разрешение на использование камеры") + .setPositiveButton("Дать доступ") { dialog, which -> + // Повторно запрашиваем разрешение + launchPermissionCamera.launch(Manifest.permission.CAMERA) + } + .setNegativeButton("Отмена") { dialog, which -> + dialog.dismiss() + }.show() + } + + private fun showOpenSettingsDialog() { + MaterialAlertDialogBuilder(this) + .setTitle("Доступ к камере запрещен") + .setMessage("Для использования камеры необходимо предоставить разрешение в настройках приложения") + .setPositiveButton("Открыть настройки") { dialog, which -> + startActivity( + Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + "package:$packageName".toUri() + ) + ) + } + .setCancelable(false) + .show() + } + private lateinit var imageView: ImageView override fun onCreate(savedInstanceState: Bundle?) { @@ -24,10 +122,35 @@ class EditProfileActivity : AppCompatActivity() { openSenderApp() true } + else -> false } } } + + imageView.setOnClickListener { + val items = arrayOf("Сделать фото", "Выбрать фото") + MaterialAlertDialogBuilder(this) + .setTitle("Выберите действие") + .setItems(items) { dialog, which -> + when (which) { + 0 -> { // Сделать фото + launchPermissionCamera.launch(Manifest.permission.CAMERA) + } + + 1 -> { // Выбрать фото из галереи + launcherGetPicture.launch("image/*") + } + } + } + .show() + } + + findViewById