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
4 changes: 4 additions & 0 deletions .kotlin/errors/errors-1746969991873.log
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
kotlin version: 2.0.21
error message: The daemon has terminated unexpectedly on startup attempt #1 with error code: 0. The daemon process output:
1. Kotlin compile daemon is ready

10 changes: 8 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ kotlin {
}

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

defaultConfig {
applicationId "otus.gpb.homework.fragments"
minSdk 26
targetSdk 34
targetSdk 35
versionCode 1
versionName "1.0"

Expand All @@ -34,6 +34,10 @@ android {
kotlinOptions {
jvmTarget = '17'
}

buildFeatures {
viewBinding true
}
}

dependencies {
Expand All @@ -42,7 +46,9 @@ 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'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation("androidx.fragment:fragment-ktx:1.8.6")
}
8 changes: 8 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,14 @@
android:supportsRtl="true"
android:theme="@style/Theme.Fragments"
tools:targetApi="31">
<activity
android:name=".Task2Activity"
android:label="Fragments - Task2"
android:exported="false" />
<activity
android:name=".Task1Activity"
android:label="Fragments - Task1"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
Expand Down
76 changes: 76 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package otus.gpb.homework.fragments

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.databinding.ActivityTask1Binding
import otus.gpb.homework.fragments.databinding.FragmentABinding


/**
* A simple [Fragment] subclass.
* Use the [FragmentA.newInstance] factory method to
* create an instance of this fragment.
*/
class FragmentA : Fragment() {
private var _binding: FragmentABinding? = null
private val binding get() = _binding!!

override fun onAttach(context: Context) {
super.onAttach(context)
val callback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (childFragmentManager.backStackEntryCount > 0) {
childFragmentManager.popBackStack()
val currentFragment = childFragmentManager.findFragmentByTag("AA")
if (currentFragment != null && currentFragment.isVisible ) {
binding.btnOpenFragmentAA.visibility = View.VISIBLE
}
} else {
isEnabled = false
activity?.onBackPressedDispatcher?.onBackPressed()
}
}
}
activity?.onBackPressedDispatcher?.addCallback(callback)
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentABinding.inflate(inflater, container, false)
return binding.root
}


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

binding.btnOpenFragmentAA.setOnClickListener {
val backgroundColor = ColorGenerator.generateColor()
childFragmentManager.beginTransaction()
.replace(R.id.fragmentContainerA, FragmentAA.newInstance(backgroundColor), "AA")
.addToBackStack(null)
.commit()
binding.btnOpenFragmentAA.visibility = View.GONE
}

}


companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @return A new instance of fragment FragmentA.
*/
@JvmStatic
fun newInstance(): FragmentA = FragmentA()
}
}
62 changes: 62 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package otus.gpb.homework.fragments

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import otus.gpb.homework.fragments.databinding.FragmentAABinding

private const val BACKGROUND_COLOR = "background_color"


/**
* A simple [Fragment] subclass.
* Use the [FragmentAA.newInstance] factory method to
* create an instance of this fragment.
*/
class FragmentAA : Fragment() {

private var _binding: FragmentAABinding? = null
private val binding get() = _binding!!
private var backGroundColor: Int? = null


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

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
backGroundColor?.let { view.setBackgroundColor(backGroundColor!!) }
binding.btnOpenFragmentAB.setOnClickListener {
val backgroundColor = ColorGenerator.generateColor()
parentFragmentManager.beginTransaction()
.replace(R.id.fragmentContainerA, FragmentAB.newInstance(backgroundColor), "AB")
.addToBackStack(null)
.commit()
}
}


override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentAABinding.inflate(inflater, container, false)
return binding.root
}

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

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup

// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val BACKGROUND_COLOR = "backGroundColor"

/**
* A simple [Fragment] subclass.
* Use the [FragmentAB.newInstance] factory method to
* create an instance of this fragment.
*/
class FragmentAB : Fragment() {

private var backGroundColor: Int? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
backGroundColor = it.getInt(BACKGROUND_COLOR)

}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
backGroundColor?.let { view.setBackgroundColor(it) }
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_a_b, container, false)
}

companion object {
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
* @return A new instance of fragment FragmentAB.
*/

@JvmStatic
fun newInstance(backGroundColor: Int) =
FragmentAB().apply {
arguments = Bundle().apply {
putInt(BACKGROUND_COLOR, backGroundColor)
}
}
}
}
86 changes: 86 additions & 0 deletions app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package otus.gpb.homework.fragments

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 android.widget.FrameLayout
import otus.gpb.homework.fragments.databinding.FragmentABinding
import otus.gpb.homework.fragments.databinding.FragmentBBinding



/**
* A simple [Fragment] subclass.
* Use the [FragmentB.newInstance] factory method to
* create an instance of this fragment.
*/
class FragmentB : Fragment(), FragmentBA.ButtonFragmentOnClickListener {

private var isLandScape = false
private var fragmentBAColor: Int? = null

private var _binding: FragmentBBinding? = null
private val binding get() = _binding!!


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
isLandScape = resources.getBoolean(R.bool.isLandscape)
fragmentBAColor = savedInstanceState?.getInt("fragmentBA_color")
if (fragmentBAColor == null) {
fragmentBAColor = ColorGenerator.generateColor()
}
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
fragmentBAColor?.let {
outState.putInt("fragmentBA_color", it)
}
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentBBinding.inflate(inflater, container, false)
return binding.root
}


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
if (!isLandScape) {
val childFragment = FragmentBA.newInstance(fragmentBAColor!!)
childFragmentManager.beginTransaction()
.replace(R.id.container_ba, childFragment)
.commit()

view.postDelayed({ (childFragment as ButtonController).addButton(true) }, 500)


} else {
childFragmentManager.beginTransaction()
.replace(R.id.container_ba, FragmentBA.newInstance(fragmentBAColor!!))
.replace(R.id.container_bb, FragmentBB.newInstance(ColorGenerator.generateColor()))
.commit()
}
}


override fun setButtonFragmentOnClickListener(button: Button) {
val fragmentBB = FragmentBB.newInstance(ColorGenerator.generateColor())
childFragmentManager.beginTransaction()
.add(R.id.container_ba, fragmentBB)
.addToBackStack(null)
.commit()
}

}

interface ButtonController {
fun addButton(isActive: Boolean)
}
Loading