diff --git a/app/build.gradle b/app/build.gradle index 57688408..824e53ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,15 +2,17 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id("io.gitlab.arturbosch.detekt") + id("kotlin-parcelize") + id'kotlin-kapt' } android { - compileSdk 34 + compileSdk 36 defaultConfig { applicationId "otus.gpb.homework.activities" - minSdk 23 - targetSdk 34 + minSdk 33 + targetSdk 36 versionCode 1 versionName "1.0" @@ -60,4 +62,5 @@ dependencies { 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:1.11.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e3d3319b..64469ed8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,12 @@ + + + + - + diff --git a/app/src/main/java/otus/gpb/homework/activities/ContractFillFormActivity.kt b/app/src/main/java/otus/gpb/homework/activities/ContractFillFormActivity.kt new file mode 100644 index 00000000..c6df34f7 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/activities/ContractFillFormActivity.kt @@ -0,0 +1,33 @@ +package otus.gpb.homework.activities + +import android.content.Context +import android.content.Intent +import androidx.activity.result.contract.ActivityResultContract +import androidx.appcompat.app.AppCompatActivity + +class ContractFillFormActivity: ActivityResultContract() { + override fun createIntent( + context: Context, + input: UserData + ): Intent { + val intent = Intent(context, FillFormActivity::class.java) + intent.putExtra(FillFormActivity.KEY_DATA, input) + return intent + } + + override fun parseResult( + resultCode: Int, + intent: Intent? + ): UserData? { + when { + resultCode == AppCompatActivity.RESULT_CANCELED -> return null + intent == null -> return null + } + val userData = UserData( + intent?.extras?.getString(FillFormActivity.KEY_NAME).toString(), + intent?.extras?.getString(FillFormActivity.KEY_SURNAME).toString(), + intent?.extras?.getString(FillFormActivity.KEY_AGE).toString(), + ) + return userData + } +} \ 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..5beefbef 100644 --- a/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt +++ b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt @@ -1,19 +1,79 @@ package otus.gpb.homework.activities +import android.Manifest +import android.Manifest.permission +import android.content.DialogInterface +import android.content.Intent +import android.content.pm.PackageManager import android.graphics.BitmapFactory import android.net.Uri import android.os.Bundle import android.widget.ImageView +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar +import otus.gpb.homework.activities.databinding.ActivityEditProfileBinding +import android.provider.Settings +import androidx.core.content.ContextCompat class EditProfileActivity : AppCompatActivity() { - + private val binding by lazy { + ActivityEditProfileBinding.inflate(layoutInflater) + } private lateinit var imageView: ImageView + private var imageUri: Uri? = null + private val arrayButtonsNames = arrayOf("Сделать фото", "Выбрать фото") + private var secondRequest : Boolean = false + private val permissionCamera = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted -> + when { + isGranted -> { + takePhoto(false) + } + !shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> { + if( !secondRequest ) { + NeedCameraDialog() + secondRequest = true + } + else + { + val builder = AlertDialog.Builder(this) + builder.apply { + setTitle("Доступ к камере") + setPositiveButton("Открыть настройки", object : DialogInterface.OnClickListener { + override fun onClick(p0: DialogInterface?, p1: Int) { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + startActivity(intent) + } + }) + create() + show() + } + } + } + else -> {} + } + } + + private val choosePictureResult = registerForActivityResult(ActivityResultContracts.GetContent()) { uri -> + if (uri != null) { + populateImage(uri) + imageUri = uri + } + } + + private val launcher = registerForActivityResult(ContractFillFormActivity()){ userData -> + if (userData != null){ + binding.textviewName.text = userData.name + binding.textviewSurname.text = userData.surname + binding.textviewAge.text = userData.age + } + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_edit_profile) + setContentView(binding.root) imageView = findViewById(R.id.imageview_photo) findViewById(R.id.toolbar).apply { @@ -28,6 +88,29 @@ class EditProfileActivity : AppCompatActivity() { } } } + + binding.imageviewPhoto.setOnClickListener() { + val builder = AlertDialog.Builder(this) + + with(builder) { + setTitle("Добавить фото") + setNegativeButton("Отмена") { _, _ -> + } + setItems(arrayOf("Сделать фото", "Выбрать фото")) { _, which -> + when (which) { + 0 -> takePhoto() + 1 -> choosePictureResult.launch("image/*") + } + } + } + builder.show() + } + + binding.button4.setOnClickListener(){ + launcher.launch(UserData(binding.textviewName.text.toString(), + binding.textviewSurname.text.toString(), + binding.textviewAge.text.toString()) ) + } } /** @@ -39,6 +122,41 @@ class EditProfileActivity : AppCompatActivity() { } private fun openSenderApp() { - TODO("В качестве реализации метода отправьте неявный Intent чтобы поделиться профилем. В качестве extras передайте заполненные строки и картинку") + val intent = Intent(Intent.ACTION_SEND).apply { + setPackage("org.telegram.messenger") + setType("image/*") + if (imageUri != null) putExtra(Intent.EXTRA_STREAM, imageUri) + putExtra(Intent.EXTRA_TEXT, "Имя : ${binding.textviewName.text}\nФамилия: ${binding.textviewSurname.text}\nВозраст: ${binding.textviewAge.text}") + } + startActivity(intent) + } + + private fun takePhoto(checkPermission: Boolean = true) { + if (checkPermission) { + val isGranted = ContextCompat.checkSelfPermission(this, permission.CAMERA) + when (isGranted) { + PackageManager.PERMISSION_GRANTED -> imageView.setImageDrawable(getDrawable(R.drawable.cat)) + else -> permissionCamera.launch(permission.CAMERA) + } + } else { + imageView.setImageDrawable(getDrawable(R.drawable.cat)) + } + } + + private fun NeedCameraDialog() { + val permissionDialog = AlertDialog.Builder(this) + + with(permissionDialog) { + setTitle("Доступ к камере") + setMessage("Доступ к камере необходим чтобы сделать ваше фото") + setPositiveButton("Дать доступ") { _, _ -> + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + } + startActivity(intent) + } + setNegativeButton("Отмена") { _, _ -> } + show() + } } } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt b/app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt new file mode 100644 index 00000000..b3483d90 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt @@ -0,0 +1,50 @@ +package otus.gpb.homework.activities + +import android.content.Intent +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import otus.gpb.homework.activities.databinding.ActivityFillFormBinding + +class FillFormActivity : AppCompatActivity() { + private val binding by lazy { + ActivityFillFormBinding.inflate(layoutInflater) + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(binding.root) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + val userData = getIntent().extras?.getParcelable(KEY_DATA, UserData::class.java) + if (userData != null) { + binding.editName.setText(userData.name) + binding.editSurname.setText(userData.surname) + binding.editAge.setText(userData.age) + } + binding.button.setOnClickListener(){ + val intent = Intent(this, EditProfileActivity::class.java) + intent.apply { + putExtra(KEY_NAME, binding.editName.text.toString()) + putExtra(KEY_SURNAME, binding.editSurname.text.toString()) + putExtra(KEY_AGE, binding.editAge.text.toString()) + } + setResult(RESULT_OK, intent) + finish() + } + + } + + companion object { + const val KEY_DATA = "userData" + const val KEY_NAME = "name" + const val KEY_SURNAME = "surname" + const val KEY_AGE = "age" + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/activities/UserData.kt b/app/src/main/java/otus/gpb/homework/activities/UserData.kt new file mode 100644 index 00000000..70c1e8a6 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/activities/UserData.kt @@ -0,0 +1,9 @@ +package otus.gpb.homework.activities + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +class UserData( val name: String, + val surname: String, + val age: String) : Parcelable diff --git a/app/src/main/res/layout/activity_fill_form.xml b/app/src/main/res/layout/activity_fill_form.xml new file mode 100644 index 00000000..560c02f2 --- /dev/null +++ b/app/src/main/res/layout/activity_fill_form.xml @@ -0,0 +1,86 @@ + + + + + + + + + +