diff --git a/JokeApp/app/build.gradle b/JokeApp/app/build.gradle index e709117..b66e789 100644 --- a/JokeApp/app/build.gradle +++ b/JokeApp/app/build.gradle @@ -11,12 +11,12 @@ apply plugin: 'androidx.navigation.safeargs' android { - compileSdk 31 + compileSdk 30 defaultConfig { applicationId "com.example.jokeapp" minSdk 24 - targetSdk 31 + targetSdk 30 versionCode 1 versionName "1.0" @@ -41,8 +41,14 @@ android { dataBinding{ enabled = true } + + testOptions.unitTests { + includeAndroidResources = true + } } + + dependencies { implementation 'androidx.core:core-ktx:1.6.0' @@ -50,13 +56,17 @@ dependencies { implementation 'com.google.android.material:material:1.4.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.test.ext:junit-ktx:1.1.3' testImplementation 'junit:junit:4.+' + testImplementation 'org.hamcrest:hamcrest:2.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + testImplementation "org.robolectric:robolectric:4.5.1" + testImplementation "androidx.arch.core:core-testing:2.1.0" implementation "android.arch.navigation:navigation-fragment-ktx:$version_navigation" implementation "android.arch.navigation:navigation-ui-ktx:$version_navigation" implementation 'com.jakewharton.timber:timber:5.0.1' - + implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' } diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/Comedian.kt b/JokeApp/app/src/main/java/com/example/jokeapp/Comedian.kt deleted file mode 100644 index ef38f2b..0000000 --- a/JokeApp/app/src/main/java/com/example/jokeapp/Comedian.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.example.jokeapp - -class Comedian (var happyJokes:Int = 0, var badJokes: Int = 0) { - /** - * A Comedian tells joke using a Jokebook - * The comedian can get good and bad points. Every three jokes there is an evaluation - */ - fun isHappy() = happyJokes > 2 - fun shouldEvaluate() = happyJokes+badJokes > 2 - - var totalJokesTold = 0 - - fun startOver() { - happyJokes = 0 - badJokes = 0 - - } - - fun goodJoke() { - happyJokes++ - } - - fun badJoke() { - badJokes++ - } - - -} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/HeaderFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/HeaderFragment.kt deleted file mode 100644 index 374c3d5..0000000 --- a/JokeApp/app/src/main/java/com/example/jokeapp/HeaderFragment.kt +++ /dev/null @@ -1,59 +0,0 @@ -package com.example.jokeapp - -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 ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [HeaderFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class HeaderFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.header_fragment, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment HeaderFragment. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - HeaderFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/JokeBook.kt b/JokeApp/app/src/main/java/com/example/jokeapp/JokeBook.kt deleted file mode 100644 index 592d7b0..0000000 --- a/JokeApp/app/src/main/java/com/example/jokeapp/JokeBook.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.example.jokeapp - -import android.util.Log -import kotlin.random.Random - -data class JokeBook (var currentJoke: String = ""){ - - - val jokes = listOf( - "My wife said I should do lunges to stay in shape. That would be a big step forward.", - "I thought the dryer was shrinking my clothes. Turns out it was the refrigerator all along", - "I only know 25 letters of the alphabet. I don't know y.", - "I asked my dog what's two minus two. He said nothing.", - "This graveyard looks overcrowded. People must be dying to get in.", - "I have a joke about chemistry, but I don't think it will get a reaction.", - "I used to be addicted to soap, but I'm clean now." - ) - - fun getRandomJoke() : String { - var randomListNumber = Random.nextInt(jokes.size) - return jokes[randomListNumber]; - } - - fun changeCurrentJoke() { - var randomListNumber = Random.nextInt(jokes.size) - if(currentJoke == jokes[randomListNumber]) randomListNumber = randomListNumber.plus(1).mod(jokes.size) - //use mod to stay in the correct range - currentJoke = jokes[randomListNumber] - } -} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/JokeFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/JokeFragment.kt deleted file mode 100644 index a9f1f9b..0000000 --- a/JokeApp/app/src/main/java/com/example/jokeapp/JokeFragment.kt +++ /dev/null @@ -1,116 +0,0 @@ -package com.example.jokeapp - -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.databinding.DataBindingUtil -import androidx.navigation.Navigation -import androidx.navigation.findNavController -import com.example.jokeapp.databinding.FragmentHomeBinding -import com.example.jokeapp.databinding.FragmentJokeBinding -import kotlin.random.Random - -/** - * A simple [Fragment] subclass. - * Use the [JokeFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class JokeFragment : Fragment() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - } - - lateinit var binding: FragmentJokeBinding - - - private val myJokeBook = JokeBook("") - private val myComedian = Comedian() - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - //Step 1, use databinding to inflate the xml - - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_joke, container, false) - - binding.jokes = myJokeBook - changeJoke() //setting an initial joke - - setOnClickListeners() - return binding.root - } - - //set click listener for each element in the list - private fun setOnClickListeners() { - val clickableElements = listOf( - binding.happyButton, - binding.nextjokeButton - ) - for (item in clickableElements){ - when(item.id){ - R.id.nextjoke_button -> item.setOnClickListener { countUnhappy(); next() } - R.id.happy_button -> item.setOnClickListener { happy(); next() } - } - } - } - - private fun next() { - //Condional navigation - /** - * If no evaluation is needed, go to next joke - * If evaluation needed, go to next screen depending on score. - */ - if(myComedian.shouldEvaluate()){ - if(myComedian.isHappy()){ - //navigate to happy fragment - //Toast.makeText(activity, "Comedian is Happy!", Toast.LENGTH_SHORT).show() - view?.findNavController()?.navigate(JokeFragmentDirections.actionJokeFragmentToHappyComedian(myComedian.happyJokes, myComedian.badJokes)) - } - else{ - //navigate to unhappy fragment - //Toast.makeText(activity, "Comedian is Unhappy", Toast.LENGTH_SHORT).show() - view?.findNavController()?.navigate(JokeFragmentDirections.actionJokeFragmentToSadComedian()) - } - myComedian.startOver() - } - else{ - changeJoke() - } - - } - - private fun happy() { - val drawableResource = when (Random.nextInt(3)) { - 0 -> R.drawable.ic_iconmonstr_smiley_1 - 1 -> R.drawable.ic_iconmonstr_smiley_13 - else -> R.drawable.ic_iconmonstr_smiley_2 - - } - binding.happyImage.setImageResource(drawableResource) - - myComedian.goodJoke() - } - - private fun changeJoke() { - //binding.jokeTextview.text = myJokeBook.getRandomJoke() - myJokeBook.changeCurrentJoke() - binding.invalidateAll() //important! this binds the new data. - } - - private fun countUnhappy(){ - myComedian.badJoke() - } - - - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - - } -} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/SadComedianFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/SadComedianFragment.kt deleted file mode 100644 index 440e9f3..0000000 --- a/JokeApp/app/src/main/java/com/example/jokeapp/SadComedianFragment.kt +++ /dev/null @@ -1,45 +0,0 @@ -package com.example.jokeapp - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.databinding.DataBindingUtil -import androidx.navigation.Navigation -import com.example.jokeapp.databinding.FragmentSadComedianBinding - - -/** - * A simple [Fragment] subclass. - * Use the [SadComedianFragment.newInstance] factory method to - * create an instance of this fragment. - */ -class SadComedianFragment : Fragment() { - lateinit var binding: FragmentSadComedianBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_sad_comedian, container, false) - setClickListeners() - return binding.root - } - - private fun setClickListeners() { - binding.homeButton.setOnClickListener( - Navigation.createNavigateOnClickListener(R.id.action_sadComedian_to_homeFragment2) - ) - - binding.startAgainButton.setOnClickListener ( - Navigation.createNavigateOnClickListener(R.id.action_sadComedian_to_jokeFragment) - ) - } -} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/HomeFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/home/HomeFragment.kt similarity index 91% rename from JokeApp/app/src/main/java/com/example/jokeapp/HomeFragment.kt rename to JokeApp/app/src/main/java/com/example/jokeapp/screens/home/HomeFragment.kt index 0b38975..4454895 100644 --- a/JokeApp/app/src/main/java/com/example/jokeapp/HomeFragment.kt +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/home/HomeFragment.kt @@ -1,4 +1,4 @@ -package com.example.jokeapp +package com.example.jokeapp.screens.home import android.os.Bundle import android.view.* @@ -8,12 +8,8 @@ import androidx.databinding.DataBindingUtil import androidx.navigation.Navigation import androidx.navigation.findNavController import androidx.navigation.ui.NavigationUI +import com.example.jokeapp.R import com.example.jokeapp.databinding.FragmentHomeBinding -import kotlin.random.Random - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER - /** * A simple [Fragment] subclass. @@ -21,6 +17,12 @@ import kotlin.random.Random * create an instance of this fragment. */ class HomeFragment : Fragment() { + + /* + Note: the HomeFragment doesn't follow the MVVM architecture to demonstrate the alternatives + The Homefragment still uses savedInstanceState and clickListeners with DataBinding + */ + lateinit var binding: FragmentHomeBinding var numberOfOncreates = 0 var numberOfOncreateViews = 0 diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeFragment.kt new file mode 100644 index 0000000..1e12d70 --- /dev/null +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeFragment.kt @@ -0,0 +1,87 @@ +package com.example.jokeapp.screens.jokes + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.findNavController +import com.example.jokeapp.R +import com.example.jokeapp.databinding.FragmentJokeBinding +import kotlin.random.Random + +/** + * A simple [Fragment] subclass. + * Use the [JokeFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class JokeFragment : Fragment() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + + lateinit var binding: FragmentJokeBinding + lateinit var viewModel : JokeViewModel + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + //Step 1, use databinding to inflate the xml + + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_joke, container, false) + + //Not OK: don't call the viewModel like a normal class. + //It needs to be special to survive e.g. config changes + //viewModel = JokeViewModel() + + viewModel = ViewModelProvider(this).get(JokeViewModel::class.java) + + binding.jokes = viewModel + + //this call allows to automatically update the livedata + //Meaning: no more resets or whatsoever + binding.setLifecycleOwner (this) + + //This is now no longer needed --> you can just call it from the XML + /*viewModel.currentJoke.observe(viewLifecycleOwner, Observer { + newJoke -> binding.jokeTextview.text = newJoke + })*/ + + + viewModel.shouldEvaluate.observe(viewLifecycleOwner, Observer { shouldEveluate -> + if(shouldEveluate){ + + view?.findNavController()?.navigate(JokeFragmentDirections.actionJokeFragmentToHappyComedian(viewModel.happyJokes, viewModel.badJokes)) + + viewModel.evaluationComplete() + } + }) + + viewModel.showSmileyEvent.observe(viewLifecycleOwner, Observer { + show -> if(show){ + showHappySmiley() + viewModel.showImageComplete() + } + }) + + return binding.root + } + + + private fun showHappySmiley() { + val drawableResource = when (Random.nextInt(3)) { + 0 -> R.drawable.ic_iconmonstr_smiley_1 + 1 -> R.drawable.ic_iconmonstr_smiley_13 + else -> R.drawable.ic_iconmonstr_smiley_2 + } + binding.happyImage.setImageResource(drawableResource) + } + +} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeViewModel.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeViewModel.kt new file mode 100644 index 0000000..a2663f9 --- /dev/null +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/jokes/JokeViewModel.kt @@ -0,0 +1,87 @@ +package com.example.jokeapp.screens.jokes + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import timber.log.Timber +import kotlin.random.Random + +class JokeViewModel: ViewModel() { + + var happyJokes = 0 + var badJokes = 0 + + private val jokes = listOf( + "My wife said I should do lunges to stay in shape. That would be a big step forward.", + "I thought the dryer was shrinking my clothes. Turns out it was the refrigerator all along", + "I only know 25 letters of the alphabet. I don't know y.", + "I asked my dog what's two minus two. He said nothing.", + "This graveyard looks overcrowded. People must be dying to get in.", + "I have a joke about chemistry, but I don't think it will get a reaction.", + "I used to be addicted to soap, but I'm clean now." + ) + + private val _currentJoke = MutableLiveData() + val currentJoke: LiveData + get() = _currentJoke + + private val _shouldEvaluate = MutableLiveData() + val shouldEvaluate : LiveData + get() = _shouldEvaluate + + private val _showSmileyEvent = MutableLiveData() + val showSmileyEvent : LiveData + get() = _showSmileyEvent + + init { + Timber.i("init is called") + changeCurrentJoke() + } + + fun changeCurrentJoke() { + //Check for evaluation: + if (happyJokes + badJokes == 3){ + _shouldEvaluate.value = true + startOver() + return + } + + var randomListNumber = Random.nextInt(jokes.size) + if(_currentJoke.value == jokes[randomListNumber]) randomListNumber = randomListNumber.plus(1).mod(jokes.size) + //use mod to stay in the correct range + _currentJoke.value = jokes[randomListNumber] + } + + fun evaluationComplete(){ + _shouldEvaluate.value = false + } + + fun showImageComplete(){ + _showSmileyEvent.value = false + } + + fun isHappy() = happyJokes > 2 + //fun shouldEvaluate() = happyJokes+badJokes > 2 + + var totalJokesTold = 0 + + fun startOver() { + happyJokes = 0 + badJokes = 0 + + } + + fun goodJoke() { + happyJokes++ + changeCurrentJoke() + _showSmileyEvent.value = true + } + + fun badJoke() { + badJokes++ + changeCurrentJoke() + } + + + +} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/HappyComedianFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/HappyComedianFragment.kt similarity index 62% rename from JokeApp/app/src/main/java/com/example/jokeapp/HappyComedianFragment.kt rename to JokeApp/app/src/main/java/com/example/jokeapp/screens/score/HappyComedianFragment.kt index b3b0a56..59c4f6f 100644 --- a/JokeApp/app/src/main/java/com/example/jokeapp/HappyComedianFragment.kt +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/HappyComedianFragment.kt @@ -1,13 +1,17 @@ -package com.example.jokeapp +package com.example.jokeapp.screens.score +import android.graphics.Color 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.core.content.ContextCompat import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider import androidx.navigation.Navigation +import com.example.jokeapp.R import com.example.jokeapp.databinding.FragmentHappyComedianBinding @@ -19,6 +23,10 @@ import com.example.jokeapp.databinding.FragmentHappyComedianBinding class HappyComedianFragment : Fragment() { lateinit var binding: FragmentHappyComedianBinding + lateinit var viewModel: ScoreViewModel + lateinit var viewModelFactory: ScoreViewModelFactory + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -28,16 +36,30 @@ class HappyComedianFragment : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_happy_comedian, container, false) + binding = DataBindingUtil.inflate(inflater, + R.layout.fragment_happy_comedian, container, false) setClickListeners() val args = HappyComedianFragmentArgs.fromBundle(requireArguments()) Toast.makeText(context, "There were ${args.numHappyJokes} happy jokes and ${args.numUnhappyJokes} bad jokes", Toast.LENGTH_SHORT).show() + viewModelFactory = ScoreViewModelFactory(args.numHappyJokes, args.numUnhappyJokes) + viewModel = ViewModelProvider(this, viewModelFactory).get(ScoreViewModel::class.java) + + setBackgroundCollor() + return binding.root } + private fun setBackgroundCollor() { + if(!viewModel.isHappy()){ + //make sad screen: + binding.scoreConstraintLayout.setBackgroundColor(ContextCompat.getColor(requireActivity(), R.color.sad_red)) + binding.textView.text = "Sad" + } + } + private fun setClickListeners() { binding.homeButton.setOnClickListener( Navigation.createNavigateOnClickListener(R.id.action_happyComedian_to_homeFragment2) diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModel.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModel.kt new file mode 100644 index 0000000..07925a8 --- /dev/null +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModel.kt @@ -0,0 +1,27 @@ +package com.example.jokeapp.screens.score + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import timber.log.Timber + +class ScoreViewModel(happyJokesCount: Int, sadJokesCount: Int) : ViewModel(){ + + private val _happyJokes = MutableLiveData() + val happyJokes: LiveData + get() = _happyJokes + + private val _sadJokes = MutableLiveData() + val sadJokes: LiveData + get() = _sadJokes + + init { + _happyJokes.value = happyJokesCount + _sadJokes.value = sadJokesCount + //Timber.i("happyJokeCount: ${happyJokesCount}") + //Timber.i("sadJokeCount: ${sadJokesCount}") + } + + fun isHappy() = happyJokes.value == 3 + +} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModelFactory.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModelFactory.kt new file mode 100644 index 0000000..5c66b38 --- /dev/null +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/score/ScoreViewModelFactory.kt @@ -0,0 +1,13 @@ +package com.example.jokeapp.screens.score + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider + +class ScoreViewModelFactory(private val happyJokes: Int, private val sadJokes: Int): ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if(modelClass.isAssignableFrom(ScoreViewModel::class.java)) { + return ScoreViewModel(happyJokes, sadJokes) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/AboutFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/AboutFragment.kt similarity index 92% rename from JokeApp/app/src/main/java/com/example/jokeapp/AboutFragment.kt rename to JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/AboutFragment.kt index c36ebc5..fcf71d3 100644 --- a/JokeApp/app/src/main/java/com/example/jokeapp/AboutFragment.kt +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/AboutFragment.kt @@ -1,4 +1,4 @@ -package com.example.jokeapp +package com.example.jokeapp.screens.utils import android.os.Bundle import androidx.fragment.app.Fragment @@ -6,6 +6,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView +import com.example.jokeapp.R /** diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/ButtonNavigationFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/ButtonNavigationFragment.kt similarity index 85% rename from JokeApp/app/src/main/java/com/example/jokeapp/ButtonNavigationFragment.kt rename to JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/ButtonNavigationFragment.kt index fd3f2ba..c3d89d7 100644 --- a/JokeApp/app/src/main/java/com/example/jokeapp/ButtonNavigationFragment.kt +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/ButtonNavigationFragment.kt @@ -1,4 +1,4 @@ -package com.example.jokeapp +package com.example.jokeapp.screens.utils import android.os.Bundle import androidx.fragment.app.Fragment @@ -7,6 +7,7 @@ import android.view.View import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.navigation.Navigation +import com.example.jokeapp.R import com.example.jokeapp.databinding.FragmentButtonNavigationBinding @@ -31,7 +32,8 @@ class ButtonNavigationFragment : Fragment() { ): View? { // Inflate the layout for this fragment //return inflater.inflate(R.layout.fragment_button_navigation, container, false) - binding = DataBindingUtil.inflate(inflater, R.layout.fragment_button_navigation, container, false) + binding = DataBindingUtil.inflate(inflater, + R.layout.fragment_button_navigation, container, false) binding.button2.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.action_homeFragment2_to_jokeFragment)) return binding.root } diff --git a/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/HeaderFragment.kt b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/HeaderFragment.kt new file mode 100644 index 0000000..c505ad9 --- /dev/null +++ b/JokeApp/app/src/main/java/com/example/jokeapp/screens/utils/HeaderFragment.kt @@ -0,0 +1,30 @@ +package com.example.jokeapp.screens.utils + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.jokeapp.R + + +/** + * A simple [Fragment] subclass. + * Use the [HeaderFragment.newInstance] factory method to + * create an instance of this fragment. + */ +class HeaderFragment : Fragment() { + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.header_fragment, container, false) + } +} \ No newline at end of file diff --git a/JokeApp/app/src/main/res/layout-land/fragment_home.xml b/JokeApp/app/src/main/res/layout-land/fragment_home.xml index cffac34..ccc735a 100644 --- a/JokeApp/app/src/main/res/layout-land/fragment_home.xml +++ b/JokeApp/app/src/main/res/layout-land/fragment_home.xml @@ -67,7 +67,7 @@ + tools:context=".screens.utils.ButtonNavigationFragment">