Skip to content
Open

dz#3 #229

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
3 changes: 2 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ plugins {
}

android {
compileSdk 34
compileSdk 35

defaultConfig {
applicationId "otus.gpb.homework.activities"
Expand Down Expand Up @@ -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'
}
9 changes: 9 additions & 0 deletions 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,6 +18,9 @@
android:supportsRtl="true"
android:theme="@style/Theme.Activities"
tools:targetApi="31">
<activity
android:name=".FillFormActivity"
android:exported="false" />

<activity
android:name=".EditProfileActivity"
Expand Down
163 changes: 160 additions & 3 deletions app/src/main/java/otus/gpb/homework/activities/EditProfileActivity.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,56 @@
package otus.gpb.homework.activities

import android.Manifest
import android.app.Activity
import android.content.Intent
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.provider.Settings
import android.util.Log
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.core.net.toUri
import com.google.android.material.dialog.MaterialAlertDialogBuilder

class EditProfileActivity : AppCompatActivity() {

private lateinit var imageView: ImageView
private lateinit var editProfile: Button
private lateinit var userFirstName: TextView
private lateinit var userSurName: TextView
private lateinit var userBirthday: TextView

private var pictureUri: Uri? = null

companion object {
private const val LOG_TAG = "VPM_Log"
private const val TELEGRAM_PACKAGE = "org.telegram.messenger"
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_edit_profile)

initViews()
setupToolbar()
setupListeners()
}

private fun initViews() {
imageView = findViewById(R.id.imageview_photo)
editProfile = findViewById(R.id.Edit_profile_button)
userFirstName = findViewById(R.id.textview_name)
userSurName = findViewById(R.id.textview_surname)
userBirthday = findViewById(R.id.textview_age)
}

private fun setupToolbar() {
findViewById<Toolbar>(R.id.toolbar).apply {
inflateMenu(R.menu.menu)
setOnMenuItemClickListener {
Expand All @@ -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()
}
}
73 changes: 73 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,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()
}
}
2 changes: 1 addition & 1 deletion app/src/main/res/layout/activity_edit_profile.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
app:layout_constraintTop_toBottomOf="@+id/textview_surname" />

<Button
android:id="@+id/button4"
android:id="@+id/Edit_profile_button"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Expand Down
57 changes: 57 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,57 @@
<?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"
android:textAlignment="center"
tools:context=".FillFormActivity">

<EditText
android:id="@+id/Surname_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="68dp"
android:hint="Surname"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/Firstname_input" />

<EditText
android:id="@+id/Firstname_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:hint="Firstname"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/Birthday_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="68dp"
android:hint="Birtday date"
android:inputType="text"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/Surname_input" />

<Button
android:id="@+id/Apply_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="268dp"
android:text="Применить"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/Birthday_input" />
</androidx.constraintlayout.widget.ConstraintLayout>
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,5 @@ kotlin.code.style=official
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
android.defaults.buildfeatures.buildconfig=true
android.nonFinalResIds=false
android.nonFinalResIds=false
android.overridePathCheck=true