Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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'
}
10 changes: 9 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-feature
android:name="android.hardware.camera"
android:required="false" />

<uses-permission android:name="android.permission.CAMERA" />

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand All @@ -12,7 +18,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.Activities"
tools:targetApi="31">

<activity
android:name=".FillFormActivity"
android:exported="false" />
<activity
android:name=".EditProfileActivity"
android:exported="true">
Expand Down
Original file line number Diff line number Diff line change
@@ -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<UserData, UserData?>() {
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
}
}
124 changes: 121 additions & 3 deletions app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt
Original file line number Diff line number Diff line change
@@ -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<Toolbar>(R.id.toolbar).apply {
Expand All @@ -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()) )
}
}

/**
Expand All @@ -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()
}
}
}
50 changes: 50 additions & 0 deletions app/src/main/java/otus/gpb/homework/activities/FillFormActivity.kt
Original file line number Diff line number Diff line change
@@ -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"
}
}
9 changes: 9 additions & 0 deletions app/src/main/java/otus/gpb/homework/activities/UserData.kt
Original file line number Diff line number Diff line change
@@ -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
86 changes: 86 additions & 0 deletions app/src/main/res/layout/activity_fill_form.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FillFormActivity">

<EditText
android:id="@+id/editName"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:ems="10"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.832"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/editSurname"
android:layout_width="250dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:ems="10"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.832"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editName" />

<EditText
android:id="@+id/editAge"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:ems="10"
android:inputType="number"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.43"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editSurname" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="68dp"
android:text="Применить"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editAge" />

<TextView
android:id="@+id/textView"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:layout_marginEnd="16dp"
android:text="Имя:"
app:layout_constraintEnd_toStartOf="@+id/editName"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textView2"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:layout_marginEnd="16dp"
android:text="Фамилия:"
app:layout_constraintEnd_toStartOf="@+id/editSurname"
app:layout_constraintTop_toBottomOf="@+id/textView" />

<TextView
android:id="@+id/textView3"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_marginTop="56dp"
android:layout_marginEnd="16dp"
android:text="Возраст:"
app:layout_constraintEnd_toStartOf="@+id/editAge"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
Loading