diff --git a/app/build.gradle b/app/build.gradle index 57688408..18aeb310 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 { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e3d3319b..f3b611de 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/EditProfileActivity.kt b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt index d55ee922..e267260b 100644 --- a/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt +++ b/app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt @@ -1,15 +1,119 @@ package otus.gpb.homework.activities +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager import android.graphics.BitmapFactory import android.net.Uri import android.os.Bundle +import android.provider.Settings import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.widget.Toolbar +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.content.ContextCompat +import android.content.DialogInterface +import android.widget.Button +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.launch class EditProfileActivity : AppCompatActivity() { private lateinit var imageView: ImageView + private var repeatRequest : Boolean = false + private lateinit var editProfileButton: Button + + private val launchPermissionCamera = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> + when { + granted -> { + // Permission granted + imageView.setImageResource(R.drawable.cat) + } + !shouldShowRequestPermissionRationale(Manifest.permission.CAMERA) -> { + if( !repeatRequest ){ + ViewDialogSettings() + } + } + else -> { + repeatRequest = true + // Permission denied + } + } + } + + fun onButtonMakePhoto(dialog: DialogInterface?, which: Int) { + val isGrantedCamera = ContextCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + if(isGrantedCamera){ + imageView.setImageResource(R.drawable.cat) + } + else{ + if( repeatRequest ){ + ViewDialogRepeat() + } + else{ + launchPermissionCamera.launch(android.Manifest.permission.CAMERA) + } + } + } + + fun onButtonSelectPhoto(dialog: DialogInterface?, which: Int) { + launchSelectPhoto.launch( + PickVisualMediaRequest( + ActivityResultContracts.PickVisualMedia.ImageOnly + ) + ) + } + + fun onButtonCancel(dialog: DialogInterface?, which: Int) { + dialog?.dismiss() + } + + fun onButtonGiveACCESS(dialog: DialogInterface?, which: Int) { + launchPermissionCamera.launch(Manifest.permission.CAMERA) + repeatRequest = false + } + + fun onButtonOpenSettings(dialog: DialogInterface?, which: Int) { + startActivity(Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + }) + } + + private fun ViewDialog() + { + MaterialAlertDialogBuilder(this) + .setTitle(resources.getString(R.string.title)) + .setNeutralButton(resources.getString(R.string.cancel), ::onButtonCancel) + .setPositiveButton(resources.getString(R.string.make_photo), ::onButtonMakePhoto) + .setNegativeButton(resources.getString(R.string.select_photo), ::onButtonSelectPhoto) + .show() + } + + private fun ViewDialogRepeat() + { + MaterialAlertDialogBuilder(this) + .setTitle(resources.getString(R.string.attention)) + .setMessage(resources.getString(R.string.message_text)) + .setPositiveButton(resources.getString(R.string.give_access), ::onButtonGiveACCESS) + .setNegativeButton(resources.getString(R.string.cancel), ::onButtonCancel) + .show() + } + + private fun ViewDialogSettings() + { + MaterialAlertDialogBuilder(this) + .setTitle(resources.getString(R.string.title)) + .setPositiveButton(resources.getString(R.string.open_settings), ::onButtonOpenSettings) + .show() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -28,17 +132,57 @@ class EditProfileActivity : AppCompatActivity() { } } } + + imageView.setOnClickListener { + ViewDialog() + } + + editProfileButton = findViewById(R.id.button4) + editProfileButton.setOnClickListener { + launchFillUserInfo.launch() + } + + } + + private val launchSelectPhoto = registerForActivityResult( + ActivityResultContracts.PickVisualMedia() + ) { result -> + result?.let { populateImage(it) } + } + + private val launchFillUserInfo = registerForActivityResult(ProfileContract()){ userInfo -> + userInfo?.firstName?.let { findViewById(R.id.textview_name).text = it } + userInfo?.lastName?.let { findViewById(R.id.textview_surname).text = it } + userInfo?.age?.let { findViewById(R.id.textview_age).text = it.toString() } } - /** - * Используйте этот метод чтобы отобразить картинку полученную из медиатеки в ImageView - */ private fun populateImage(uri: Uri) { val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri)) imageView.setImageBitmap(bitmap) + imageView.tag = uri } private fun openSenderApp() { - TODO("В качестве реализации метода отправьте неявный Intent чтобы поделиться профилем. В качестве extras передайте заполненные строки и картинку") + val intent = Intent().apply { + action = Intent.ACTION_SEND + type = "image/*" + setPackage("org.telegram.messenger") + + val imgUri = imageView.tag as? Uri + if (imgUri != null) putExtra(Intent.EXTRA_STREAM, imgUri) + var firstName = findViewById(R.id.textview_name).text + var lastName = findViewById(R.id.textview_surname).text + var age = findViewById(R.id.textview_age).text + + putExtra(Intent.EXTRA_TEXT, + "Имя : ${firstName}\n" + + "Фамилия : ${lastName}\n" + + "Возраст : ${age}\n") + } + + runCatching { + startActivity(intent) + } } + } \ 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..825b42bb --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt @@ -0,0 +1,41 @@ +package otus.gpb.homework.activities + +import android.content.Intent +import android.os.Bundle +import android.widget.Button +import android.widget.EditText +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat + +class FillFormActivity : AppCompatActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_fill_form) + 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 + } + + findViewById