diff --git a/app/build.gradle b/app/build.gradle index 57688408..d4970256 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { } android { - compileSdk 34 + compileSdk 35 defaultConfig { applicationId "otus.gpb.homework.activities" @@ -60,4 +60,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.10.0' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e3d3319b..81510c87 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,12 @@ + + + + + (R.id.toolbar).apply { inflateMenu(R.menu.menu) setOnMenuItemClickListener { @@ -30,15 +65,137 @@ class EditProfileActivity : AppCompatActivity() { } } + private fun setupListeners() { + imageView.setOnClickListener { showImageSourceDialog() } + + editProfile.setOnClickListener { + val intent = Intent(this, FillFormActivity::class.java) + fillFormAct.launch(intent) + } + } + + private fun showImageSourceDialog() { + val items = arrayOf("Сделать фото", "Выбрать фото") + + MaterialAlertDialogBuilder(this) + .setItems(items) { _, which -> + when (which) { + 0 -> setCameraPermission.launch(Manifest.permission.CAMERA) + 1 -> openGallery() + } + } + .show() + } + + private fun openGallery() { + val intent = Intent( + Intent.ACTION_PICK, + MediaStore.Images.Media.INTERNAL_CONTENT_URI + ) + showPicture.launch(intent) + } + /** - * Используйте этот метод чтобы отобразить картинку полученную из медиатеки в ImageView + * Отобразить картинку из медиатеки */ private fun populateImage(uri: Uri) { - val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri)) + val bitmap = + BitmapFactory.decodeStream(contentResolver.openInputStream(uri)) imageView.setImageBitmap(bitmap) } private fun openSenderApp() { - TODO("В качестве реализации метода отправьте неявный Intent чтобы поделиться профилем. В качестве extras передайте заполненные строки и картинку") + + val textToSend = + "${userFirstName.text} ${userSurName.text} ${userBirthday.text}" + + val shareIntent = Intent(Intent.ACTION_SEND).apply { + setPackage(TELEGRAM_PACKAGE) + type = "image/*" + + pictureUri?.let { + putExtra(Intent.EXTRA_STREAM, it) + } + + putExtra(Intent.EXTRA_TEXT, textToSend) + } + + startActivity(shareIntent) + } + + private val fillFormAct = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + + if (result.resultCode == Activity.RESULT_OK) { + + val data = result.data + + userFirstName.text = data?.getStringExtra("firstname") + userSurName.text = data?.getStringExtra("surname") + userBirthday.text = data?.getStringExtra("birthday") + + val sendText = + "${userFirstName.text} ${userSurName.text} ${userBirthday.text}" + + Log.d(LOG_TAG, sendText) + } + } + + private val setCameraPermission = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { isPermit -> + + if (isPermit) { + imageView.setImageResource(R.drawable.cat) + return@registerForActivityResult + } + + if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { + clarifyingDialog() + } else { + settingsDialog() + } + } + + private val showPicture = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + + if (result.resultCode == Activity.RESULT_OK) { + + val imgUri = result.data?.data + + imgUri?.let { + pictureUri = it + populateImage(it) + } + } + } + + private fun clarifyingDialog() { + MaterialAlertDialogBuilder(this) + .setTitle("Камера отключена") + .setMessage("Необходимо настроить разрешение для камеры") + .setPositiveButton("Настроить разрешение") { _, _ -> + setCameraPermission.launch(Manifest.permission.CAMERA) + } + .setNegativeButton("Отмена") { dialog, _ -> + dialog.dismiss() + } + .show() + } + + private fun settingsDialog() { + MaterialAlertDialogBuilder(this) + .setCancelable(true) + .setTitle("Камера отключена") + .setMessage("Необходимо настроить разрешение для камеры") + .setPositiveButton("Открыть настройки") { _, _ -> + startActivity( + Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + "package:$packageName".toUri() + ) + ) + } + .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..1d299363 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt @@ -0,0 +1,73 @@ +package otus.gpb.homework.activities + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.widget.Button +import android.widget.EditText +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat + +class FillFormActivity : AppCompatActivity() { + + private lateinit var applyButton: Button + private lateinit var firstName: EditText + private lateinit var surName: EditText + private lateinit var birthday: EditText + + companion object { + const val EXTRA_FIRSTNAME = "firstname" + const val EXTRA_SURNAME = "surname" + const val EXTRA_BIRTHDAY = "birthday" + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + enableEdgeToEdge() + setContentView(R.layout.activity_fill_form) + + setupInsets() + initViews() + setupListeners() + } + + private fun setupInsets() { + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { view, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + view.setPadding( + systemBars.left, + systemBars.top, + systemBars.right, + systemBars.bottom + ) + insets + } + } + + private fun initViews() { + applyButton = findViewById(R.id.Apply_button) + firstName = findViewById(R.id.Firstname_input) + surName = findViewById(R.id.Surname_input) + birthday = findViewById(R.id.Birthday_input) + } + + private fun setupListeners() { + applyButton.setOnClickListener { + sendResult() + } + } + + private fun sendResult() { + val resultIntent = Intent().apply { + putExtra(EXTRA_FIRSTNAME, firstName.text.toString()) + putExtra(EXTRA_SURNAME, surName.text.toString()) + putExtra(EXTRA_BIRTHDAY, birthday.text.toString()) + } + + setResult(Activity.RESULT_OK, resultIntent) + finish() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_edit_profile.xml b/app/src/main/res/layout/activity_edit_profile.xml index eb4a7197..704c0d9d 100644 --- a/app/src/main/res/layout/activity_edit_profile.xml +++ b/app/src/main/res/layout/activity_edit_profile.xml @@ -61,7 +61,7 @@ app:layout_constraintTop_toBottomOf="@+id/textview_surname" />