From 841eae6c513414c9a41bb0509b25e4f9ee5b45fb Mon Sep 17 00:00:00 2001 From: Dmitriy Bulygin Date: Thu, 13 Nov 2025 17:43:05 +0300 Subject: [PATCH 1/2] added tasks solutions --- app/build.gradle | 8 +- app/src/main/AndroidManifest.xml | 9 +++ .../gpb/homework/fragments/ExchangeDataExt.kt | 31 +++++++ .../gpb/homework/fragments/FirstActivity.kt | 27 +++++++ .../otus/gpb/homework/fragments/FragmentA.kt | 79 ++++++++++++++++++ .../otus/gpb/homework/fragments/FragmentAA.kt | 44 ++++++++++ .../otus/gpb/homework/fragments/FragmentAB.kt | 23 ++++++ .../otus/gpb/homework/fragments/FragmentB.kt | 32 ++++++++ .../otus/gpb/homework/fragments/FragmentBA.kt | 81 +++++++++++++++++++ .../otus/gpb/homework/fragments/FragmentBB.kt | 48 +++++++++++ .../gpb/homework/fragments/MainActivity.kt | 17 +++- .../gpb/homework/fragments/SecondActivity.kt | 25 ++++++ .../gpb/homework/fragments/ThirdActivity.kt | 50 ++++++++++++ .../main/res/layout-land/activity_third.xml | 28 +++++++ .../res/layout-sw600dp/activity_third.xml | 27 +++++++ app/src/main/res/layout/activity_first.xml | 14 ++++ app/src/main/res/layout/activity_main.xml | 29 +++++-- app/src/main/res/layout/activity_second.xml | 14 ++++ app/src/main/res/layout/activity_third.xml | 11 +++ app/src/main/res/layout/fragment_a.xml | 27 +++++++ app/src/main/res/layout/fragment_aa.xml | 26 ++++++ app/src/main/res/layout/fragment_ab.xml | 20 +++++ app/src/main/res/layout/fragment_b.xml | 15 ++++ app/src/main/res/layout/fragment_b_a.xml | 16 ++++ app/src/main/res/layout/fragment_b_b.xml | 17 ++++ app/src/main/res/values-sw600dp/bool.xml | 4 + app/src/main/res/values/bool.xml | 4 + app/src/main/res/values/strings.xml | 2 + build.gradle | 10 +-- gradle.properties | 3 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 31 files changed, 724 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/otus/gpb/homework/fragments/ExchangeDataExt.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FirstActivity.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/SecondActivity.kt create mode 100644 app/src/main/java/otus/gpb/homework/fragments/ThirdActivity.kt create mode 100644 app/src/main/res/layout-land/activity_third.xml create mode 100644 app/src/main/res/layout-sw600dp/activity_third.xml create mode 100644 app/src/main/res/layout/activity_first.xml create mode 100644 app/src/main/res/layout/activity_second.xml create mode 100644 app/src/main/res/layout/activity_third.xml create mode 100644 app/src/main/res/layout/fragment_a.xml create mode 100644 app/src/main/res/layout/fragment_aa.xml create mode 100644 app/src/main/res/layout/fragment_ab.xml create mode 100644 app/src/main/res/layout/fragment_b.xml create mode 100644 app/src/main/res/layout/fragment_b_a.xml create mode 100644 app/src/main/res/layout/fragment_b_b.xml create mode 100644 app/src/main/res/values-sw600dp/bool.xml create mode 100644 app/src/main/res/values/bool.xml diff --git a/app/build.gradle b/app/build.gradle index c5cf1b8..dbd1112 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ kotlin { } android { - compileSdk 34 + compileSdk 36 namespace "otus.gpb.homework.fragments" defaultConfig { @@ -21,6 +21,10 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + buildFeatures { + viewBinding true + } + buildTypes { release { minifyEnabled false @@ -42,6 +46,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.11.0' + implementation 'androidx.fragment:fragment-ktx:1.8.9' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 9604b34..4ccebbd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,15 @@ android:supportsRtl="true" android:theme="@style/Theme.Fragments" tools:targetApi="31"> + + + diff --git a/app/src/main/java/otus/gpb/homework/fragments/ExchangeDataExt.kt b/app/src/main/java/otus/gpb/homework/fragments/ExchangeDataExt.kt new file mode 100644 index 0000000..f3122f1 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ExchangeDataExt.kt @@ -0,0 +1,31 @@ +package otus.gpb.homework.fragments + +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.fragment.app.setFragmentResult +import androidx.fragment.app.setFragmentResultListener + +const val COLOR_REQUEST_KEY = "request_key" +const val COLOR_RESULT_KEY = "result_key" + +fun Fragment.sendResult(data: Int, isTablet: Boolean = false) { + if (isTablet) { + requireActivity().supportFragmentManager.setFragmentResult(COLOR_REQUEST_KEY, bundleOf(COLOR_RESULT_KEY to data)) + } else { + setFragmentResult(COLOR_REQUEST_KEY, bundleOf(COLOR_RESULT_KEY to data)) + } +} + +fun Fragment.observeResult(isTablet: Boolean = false, callback: (Int) -> Unit) { + if (isTablet) { + requireActivity().supportFragmentManager.setFragmentResultListener(COLOR_REQUEST_KEY, viewLifecycleOwner) { _, bundle -> + val data = bundle.getInt(COLOR_RESULT_KEY) + callback(data) + } + } else { + setFragmentResultListener(COLOR_REQUEST_KEY) { _, bundle -> + val data = bundle.getInt(COLOR_RESULT_KEY) + callback(data) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FirstActivity.kt b/app/src/main/java/otus/gpb/homework/fragments/FirstActivity.kt new file mode 100644 index 0000000..6b40597 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FirstActivity.kt @@ -0,0 +1,27 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import otus.gpb.homework.fragments.databinding.ActivityFirstBinding + +class FirstActivity : AppCompatActivity() { + private var binding: ActivityFirstBinding? = null + private lateinit var fragmentA: FragmentA + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityFirstBinding.inflate(layoutInflater) + setContentView(binding?.root) + + if (savedInstanceState == null) { + fragmentA = FragmentA() + } else { + fragmentA = supportFragmentManager.findFragmentByTag("FragmentA") as FragmentA + } + + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentA_container, fragmentA, "FragmentA") + .addToBackStack(null) + .commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt new file mode 100644 index 0000000..cf42d09 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentA.kt @@ -0,0 +1,79 @@ +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 android.widget.Button +import android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.core.view.isVisible +import otus.gpb.homework.fragments.databinding.FragmentABinding + +class FragmentA : Fragment() { + private var _binding: FragmentABinding? = null + val binding get() = _binding!! + + override fun onAttach(context: Context) { + super.onAttach(context) + + requireActivity().onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val count = childFragmentManager.backStackEntryCount +// Toast.makeText(requireContext(), "BackStack count: $count", Toast.LENGTH_SHORT) +// .show() + when { + count > 1 -> childFragmentManager.popBackStack() + count == 1 -> { + binding.buttonA.visibility = View.VISIBLE + binding.textViewA.visibility = View.VISIBLE + + childFragmentManager.popBackStack() + } + count == 0 -> requireActivity().finish() + else -> { + isEnabled = false + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + } + }) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentABinding.inflate(inflater, container, false) + val view = binding.root + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.buttonA.setOnClickListener { + openFragmentAA() + } + } + + private fun openFragmentAA() { + val fragmentAA = FragmentAA() + childFragmentManager.beginTransaction() + .replace(R.id.containerA, fragmentAA) + .addToBackStack(null) + .commit() + + binding.buttonA.visibility = View.GONE + binding.textViewA.visibility = View.GONE + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt new file mode 100644 index 0000000..8ae37db --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAA.kt @@ -0,0 +1,44 @@ +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 + +class FragmentAA : Fragment() { + private var _binding: FragmentAaBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentAaBinding.inflate(inflater, container, false) + val view = binding.root + binding.containerAA.setBackgroundColor(ColorGenerator.generateColor()) + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.buttonAB.setOnClickListener { + openFragmentAB() + } + } + + private fun openFragmentAB() { + val fragmentAB = FragmentAB() + parentFragmentManager.beginTransaction() + .replace(R.id.containerA, fragmentAB) + .addToBackStack(null) + .commit() + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt new file mode 100644 index 0000000..4d5babe --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentAB.kt @@ -0,0 +1,23 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import otus.gpb.homework.fragments.databinding.FragmentAbBinding + +class FragmentAB : Fragment() { + private var _binding: FragmentAbBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentAbBinding.inflate(inflater, container, false) + val view = binding.root + binding.containerAB.setBackgroundColor(ColorGenerator.generateColor()) + return view + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt new file mode 100644 index 0000000..fdeb211 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentB.kt @@ -0,0 +1,32 @@ +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.FragmentBBinding + +class FragmentB : Fragment() { + private var _binding: FragmentBBinding? = null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentBBinding.inflate(inflater, container, false) + val view = binding.root + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt new file mode 100644 index 0000000..ad7e38f --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBA.kt @@ -0,0 +1,81 @@ +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 android.widget.Toast +import androidx.activity.OnBackPressedCallback +import androidx.fragment.app.setFragmentResultListener +import otus.gpb.homework.fragments.databinding.FragmentBABinding + +class FragmentBA : Fragment() { + private var _binding: FragmentBABinding? = null + private val binding get() = _binding!! + private var isTablet = false + + override fun onAttach(context: Context) { + super.onAttach(context) + + requireActivity().onBackPressedDispatcher.addCallback( + this, + object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val count = childFragmentManager.backStackEntryCount + Toast.makeText(requireContext(), "BackStack count: $count", Toast.LENGTH_SHORT) + .show() + when { + count > 1 -> childFragmentManager.popBackStack() + count == 1 -> { + binding.buttonBA.visibility = View.VISIBLE + childFragmentManager.popBackStack() + } + + count == 0 -> requireActivity().finish() + else -> { + isEnabled = false + requireActivity().onBackPressedDispatcher.onBackPressed() + } + } + } + }) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentBABinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + isTablet = requireActivity().findViewById(R.id.fragment1) != null + + if (isTablet) { + binding.buttonBA.visibility = View.GONE + } + + observeResult(isTablet) { color -> + binding.containerBA.setBackgroundColor(color) + } + + binding.buttonBA.setOnClickListener { + openFragmentBB() + } + } + + private fun openFragmentBB() { + val fragmentBB = FragmentBB() + childFragmentManager.beginTransaction() + .replace(R.id.containerBA, fragmentBB) + .addToBackStack(null) + .commit() + + binding.buttonBA.visibility = View.GONE + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt new file mode 100644 index 0000000..f1cac12 --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/FragmentBB.kt @@ -0,0 +1,48 @@ +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.FragmentBBBinding + +class FragmentBB : Fragment() { + private var _binding: FragmentBBBinding? = null + private val binding get() = _binding!! + private var isTablet = false + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentBBBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + isTablet = requireActivity().findViewById(R.id.fragment1) != null + + binding.buttonSendColorToBA.setOnClickListener { + val color = ColorGenerator.generateColor() + if (isTablet) { + sendResult(color, true) + } else { + sendResult(color) + openFragmentBA() + } + } + } + + private fun openFragmentBA() { + parentFragmentManager.beginTransaction() + .replace(R.id.containerBA, FragmentBA()) + .addToBackStack(null) + .commit() + } + +} + + diff --git a/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt b/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt index 5e89c44..e6e655b 100644 --- a/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt +++ b/app/src/main/java/otus/gpb/homework/fragments/MainActivity.kt @@ -1,12 +1,27 @@ package otus.gpb.homework.fragments +import android.content.Intent import android.os.Bundle import androidx.appcompat.app.AppCompatActivity +import otus.gpb.homework.fragments.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { + private var binding: ActivityMainBinding? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding?.root) + + binding?.buttonOpenFragmentA?.setOnClickListener { + startActivity(Intent(this, FirstActivity::class.java)) + } + binding?.buttonOpenFragmentB?.setOnClickListener { + startActivity(Intent(this, SecondActivity::class.java)) + } + binding?.buttonOpenFragmentC?.setOnClickListener { + startActivity(Intent(this, ThirdActivity::class.java)) + } } + } \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/SecondActivity.kt b/app/src/main/java/otus/gpb/homework/fragments/SecondActivity.kt new file mode 100644 index 0000000..1e39e8c --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/SecondActivity.kt @@ -0,0 +1,25 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity +import otus.gpb.homework.fragments.databinding.ActivitySecondBinding + +class SecondActivity : AppCompatActivity() { + private var binding: ActivitySecondBinding? = null + private lateinit var fragmentB: FragmentB + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySecondBinding.inflate(layoutInflater) + setContentView(binding?.root) + + if (savedInstanceState == null) { + fragmentB = FragmentB() + } else { + } + + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentB_container, fragmentB) + .commit() + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/gpb/homework/fragments/ThirdActivity.kt b/app/src/main/java/otus/gpb/homework/fragments/ThirdActivity.kt new file mode 100644 index 0000000..2e2f1eb --- /dev/null +++ b/app/src/main/java/otus/gpb/homework/fragments/ThirdActivity.kt @@ -0,0 +1,50 @@ +package otus.gpb.homework.fragments + +import android.os.Bundle +import android.widget.Toast +import androidx.fragment.app.FragmentActivity +import otus.gpb.homework.fragments.databinding.ActivityThirdBinding + +class ThirdActivity : FragmentActivity() { + private var binding: ActivityThirdBinding? = null + private lateinit var fragmentBA: FragmentBA + private lateinit var fragmentBB: FragmentBB + private var isTablet = false + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityThirdBinding.inflate(layoutInflater) + setContentView(binding?.root) + + determinePaneLayout() + + fragmentBA = supportFragmentManager.findFragmentByTag("FragmentBA") as? FragmentBA ?: FragmentBA() + fragmentBB = supportFragmentManager.findFragmentByTag("FragmentBB") as? FragmentBB ?: FragmentBB() + + if (isTablet) { + if (supportFragmentManager.findFragmentByTag("FragmentBB")?.view?.parent == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.fragment1, fragmentBB, "FragmentBB") + .commit() + } + if (supportFragmentManager.findFragmentByTag("FragmentBA")?.view?.parent == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.containerBA, fragmentBA, "FragmentBA") + .commit() + } + } else { + if (supportFragmentManager.findFragmentByTag("FragmentBA")?.view?.parent == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.fragmentC_container, fragmentBA, "FragmentBA") + .commit() + } + } + } + + private fun determinePaneLayout() { + val containerBA = binding?.root?.findViewById(R.id.containerBA) + val fragment1 = binding?.root?.findViewById(R.id.fragment1) + isTablet = containerBA != null && fragment1 != null + Toast.makeText(this, "isTablet: $isTablet", Toast.LENGTH_SHORT).show() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_third.xml b/app/src/main/res/layout-land/activity_third.xml new file mode 100644 index 0000000..ff11a02 --- /dev/null +++ b/app/src/main/res/layout-land/activity_third.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layout-sw600dp/activity_third.xml b/app/src/main/res/layout-sw600dp/activity_third.xml new file mode 100644 index 0000000..3fc5318 --- /dev/null +++ b/app/src/main/res/layout-sw600dp/activity_third.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_first.xml b/app/src/main/res/layout/activity_first.xml new file mode 100644 index 0000000..9906d7b --- /dev/null +++ b/app/src/main/res/layout/activity_first.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 17eab17..ecdcaea 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,18 +1,31 @@ - - + android:layout_gravity="center" + android:text="Open Fragment A" /> - \ No newline at end of file +