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
8 changes: 3 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,8 @@ plugins {
id 'org.jetbrains.kotlin.android'
}

kotlin {
jvmToolchain(17)
}

android {
compileSdk 34
compileSdk 35
namespace "otus.gpb.homework.fragments"

defaultConfig {
Expand Down Expand Up @@ -42,6 +38,8 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.activity:activity:1.10.1'
implementation 'androidx.fragment:fragment-ktx:1.8.6'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Expand Down
6 changes: 6 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
android:supportsRtl="true"
android:theme="@style/Theme.Fragments"
tools:targetApi="31">
<activity
android:name=".ui.ActivityB"
android:exported="false" />
<activity
android:name=".ui.ActivityA"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package otus.gpb.homework.fragments

import android.graphics.Color
import java.util.Random
import androidx.core.graphics.toColorInt

object ColorGenerator {

fun generateColor(): Int {
val nextInt = Random().nextInt(0xffffff + 1)
val colorCode = String.format("#%06x", nextInt)
return Color.parseColor(colorCode)
return colorCode.toColorInt()
}
}
13 changes: 13 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
package otus.gpb.homework.fragments

import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import otus.gpb.homework.fragments.ui.ActivityA
import otus.gpb.homework.fragments.ui.ActivityB
import android.content.Intent

class MainActivity : AppCompatActivity() {

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

findViewById<Button>(R.id.buttonOpenActivityA).setOnClickListener{
startActivity(Intent(this@MainActivity, ActivityA::class.java))
}

findViewById<Button>(R.id.buttonOpenActivityB).setOnClickListener{
startActivity(Intent(this@MainActivity, ActivityB::class.java))
}
}

}
24 changes: 24 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/ActivityA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package otus.gpb.homework.fragments.ui

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.fragments.R

class ActivityA : AppCompatActivity() {
private lateinit var fragmentA: FragmentA

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

if (savedInstanceState == null) {
fragmentA = FragmentA()
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragmentA, "fragmentA")
.commit()
}
}
}
27 changes: 27 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/ActivityB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package otus.gpb.homework.fragments.ui

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.fragments.R

class ActivityB : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_b)
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
}
if (savedInstanceState == null) {
val fragmentB = FragmentB()
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragmentB, "fragmentB")
.commit()
}
}
}
80 changes: 80 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/FragmentA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package otus.gpb.homework.fragments.ui

import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import androidx.activity.OnBackPressedCallback
import otus.gpb.homework.fragments.ColorGenerator
import otus.gpb.homework.fragments.R
import androidx.fragment.app.setFragmentResultListener

class FragmentA : Fragment() {

private lateinit var openButton: Button

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {

}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_a, container, false)
openButton = rootView.findViewById(R.id.buttonOpenAA)
rootView.findViewById<Button>(R.id.buttonOpenAA).setOnClickListener {
val color = ColorGenerator.generateColor()
val fragmentAA = FragmentAA.newInstance(color)
childFragmentManager.beginTransaction()
.replace(R.id.container, fragmentAA, "fragmentAA")
.addToBackStack("fragmentAA")
.commit()
openButton.visibility = View.GONE
}
return rootView
}

override fun onAttach(context: Context) {
super.onAttach(context)

val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (childFragmentManager.backStackEntryCount > 0) {
childFragmentManager.popBackStack()
if (childFragmentManager.backStackEntryCount == 1)
openButton.visibility = View.VISIBLE
} else {
requireActivity().finish()
}
}
}
requireActivity().onBackPressedDispatcher.addCallback(callback)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

childFragmentManager.setFragmentResultListener(SHOW_FRAGMENT_AB, this) { _, _ ->
val color = ColorGenerator.generateColor()
val fragmentAB = FragmentAB.newInstance(color)
childFragmentManager.beginTransaction()
.replace(R.id.container, fragmentAB, "fragmentAB")
.addToBackStack("fragmentAB")
.commit()
openButton.visibility = View.GONE
}
}


companion object{
const val SHOW_FRAGMENT_AB = "show fragmentAB"
}
}
50 changes: 50 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/FragmentAA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package otus.gpb.homework.fragments.ui

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import otus.gpb.homework.fragments.R
import androidx.core.graphics.drawable.toDrawable
import androidx.core.os.bundleOf
import androidx.fragment.app.setFragmentResult
import otus.gpb.homework.fragments.ColorGenerator

private const val COLOR = "color"

class FragmentAA : Fragment() {
private var color: Int? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
color = it.getInt(COLOR)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_aa, container, false)
rootView.background = color?.toDrawable()
rootView.findViewById<Button>(R.id.buttonOpenAB).setOnClickListener{
rootView.findViewById<Button>(R.id.buttonOpenAB).visibility = View.GONE
setFragmentResult(FragmentA.SHOW_FRAGMENT_AB, bundleOf())
}
return rootView
}

companion object {
@JvmStatic
fun newInstance(color: Int) =
FragmentAA().apply {
arguments = Bundle().apply {
putInt(COLOR, color)
}
}
}
}
42 changes: 42 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/FragmentAB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package otus.gpb.homework.fragments.ui

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.graphics.drawable.toDrawable
import otus.gpb.homework.fragments.R


private const val COLOR = "color"

class FragmentAB : Fragment() {
private var color: Int? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
color = it.getInt(COLOR)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView = inflater.inflate(R.layout.fragment_aa, container, false)
rootView.background = color?.toDrawable()
return rootView
}

companion object {
@JvmStatic
fun newInstance(color: Int) =
FragmentAA().apply {
arguments = Bundle().apply {
putInt(COLOR, color)
}
}
}
}
62 changes: 62 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/ui/FragmentB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package otus.gpb.homework.fragments.ui

import android.content.Context
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.activity.OnBackPressedCallback
import otus.gpb.homework.fragments.ColorGenerator
import otus.gpb.homework.fragments.R

class FragmentB : Fragment() {

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val rootView = inflater.inflate(R.layout.fragment_b, container, false)
rootView.findViewById<View>(R.id.container)?.let {
createFragmentBA(it.id)
}
rootView.findViewById<View>(R.id.containerLeft)?.let {
createFragmentBA(it.id)
}
rootView.findViewById<View>(R.id.containerRight)?.let {
createFragmentBB(it.id)
}
return rootView
}

override fun onAttach(context: Context) {
super.onAttach(context)

val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (childFragmentManager.backStackEntryCount > 1) {
childFragmentManager.popBackStack()
} else {
requireActivity().finish()
}
}
}
requireActivity().onBackPressedDispatcher.addCallback(callback)
}

private fun createFragmentBA(containerId: Int){
val fragmentBA = FragmentBA()
childFragmentManager.beginTransaction()
.replace(containerId, fragmentBA, "fragmentBA")
.addToBackStack("fragmentBA")
.commit()
}

private fun createFragmentBB(containerId: Int){
val fragmentBB = FragmentBB()
childFragmentManager.beginTransaction()
.replace(containerId, fragmentBB, "fragmentBB")
.commit()
}
}
Loading