From 245ff1bffdcaf5289b742fe748637fb235ba2ba5 Mon Sep 17 00:00:00 2001 From: Lucas Delanier Date: Fri, 7 Apr 2023 17:49:57 +0200 Subject: [PATCH] working livedata on craft --- .../com/example/shakecraft/BossFragment.kt | 6 ++- .../com/example/shakecraft/CollectFragment.kt | 8 +++- .../com/example/shakecraft/CraftFragment.kt | 17 +++++---- .../com/example/shakecraft/HomeFragment.kt | 7 +++- .../example/shakecraft/InventoryFragment.kt | 37 ++++++++++++------- .../com/example/shakecraft/MainActivity.kt | 18 +++------ .../shakecraft/viewmodel/MainViewModel.kt | 12 +++++- 7 files changed, 66 insertions(+), 39 deletions(-) diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt index bba4a8b..f93d96b 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/BossFragment.kt @@ -17,6 +17,7 @@ import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -63,7 +64,10 @@ class BossFragment() : Fragment() { setUpRecyclerView(view) // Set up accelerometer listener - setUpAccelerometerListener(view, viewModel.currentPlayer) + viewModel.currentPlayer.observe(viewLifecycleOwner, Observer { + setUpAccelerometerListener(view, it) + }) + // Set up activity orientation setUpActivityOrientation() diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt index b8c88ce..b6e0464 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CollectFragment.kt @@ -17,6 +17,7 @@ import android.widget.ImageView import android.widget.ProgressBar import android.widget.TextView import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController @@ -53,7 +54,12 @@ class CollectFragment() : Fragment() { initializeViews(view) // Set up accelerometer listener - setUpAccelerometerListener(view,viewModel.currentPlayer) + + viewModel.currentPlayer.observe(viewLifecycleOwner, Observer { + setUpAccelerometerListener(view, it) + }) + + // Set up activity orientation setUpActivityOrientation() diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt index 537720b..b6430f2 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/CraftFragment.kt @@ -9,6 +9,7 @@ import android.widget.Button import android.widget.ImageView import android.widget.TextView import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -29,7 +30,7 @@ class CraftFragment : Fragment() { private lateinit var buttonForgeMax: Button private lateinit var numberCraftable: TextView private lateinit var craftValue : TextView - val viewModel : MainViewModel by activityViewModels() + private val viewModel : MainViewModel by activityViewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -45,8 +46,12 @@ class CraftFragment : Fragment() { val view = inflater.inflate(R.layout.fragment_craft, container, false) recipe = arguments?.getParcelable("recipe")!! - initializeViews(view, viewModel.currentPlayer) - setUpRecyclerView(view,viewModel.currentPlayer) + + viewModel.currentPlayer.observe(this.viewLifecycleOwner, Observer {player -> + initializeViews(view, player) + setUpRecyclerView(view, player) + }) + return view } @@ -85,14 +90,10 @@ class CraftFragment : Fragment() { craftValue.text = recipe.item.stack.toString() buttonForge.setOnClickListener{ - currentPlayer.craft(recipe) - initializeViews(view, currentPlayer) - setUpRecyclerView(view, currentPlayer) + viewModel.craft(recipe) } buttonForgeMax.setOnClickListener{ currentPlayer.craft(recipe, RecipeManager.HowManyCraftable(recipe, currentPlayer)) - initializeViews(view, currentPlayer) - setUpRecyclerView(view, currentPlayer) } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt index a9f27c7..2ffd56b 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/HomeFragment.kt @@ -12,6 +12,7 @@ import android.widget.ProgressBar import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.navigation.NavOptions import androidx.navigation.fragment.findNavController import com.example.shakecraft.model.Player @@ -46,7 +47,11 @@ class HomeFragment : Fragment() { val view = inflater.inflate(R.layout.fragment_home,container,false) // Initialize views - initializeViews(view, viewModel.currentPlayer, isRaining) + + viewModel.currentPlayer.observe(viewLifecycleOwner, Observer { + initializeViews(view, it, isRaining) + }) + return view } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt index 2ead5e4..dce71f8 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/InventoryFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.fragment.app.activityViewModels +import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.example.shakecraft.model.Tool @@ -23,15 +24,18 @@ class InventoryFragment() : Fragment( ), AdapterInventory.OnItemLongClickListene } override fun onItemLongClick(position: Int) { - if (viewModel.currentPlayer.items[position] is Tool) { - val text = if (viewModel.currentPlayer.equipeItem(viewModel.currentPlayer.items[position]) ) " was well equipped" else " has been well unequipped" - Toast.makeText( - context, - viewModel.currentPlayer.items[position].type.name + text, - Toast.LENGTH_SHORT - ).show() - setUpRecyclerView(view?.parent as ViewGroup, this) - } + viewModel.currentPlayer.observe(viewLifecycleOwner, Observer { + if (it.items[position] is Tool) { + val text = if (it.equipeItem(it.items[position]) ) " was well equipped" else " has been well unequipped" + Toast.makeText( + context, + it.items[position].type.name + text, + Toast.LENGTH_SHORT + ).show() + setUpRecyclerView(view?.parent as ViewGroup, this) + } + }) + } override fun onCreateView( @@ -46,11 +50,18 @@ class InventoryFragment() : Fragment( ), AdapterInventory.OnItemLongClickListene return view } private fun setUpRecyclerView(view: View,listener: AdapterInventory.OnItemLongClickListener ) { + recyclerView = view.findViewById(R.id.recyclerviewInventory) - with(recyclerView) { - layoutManager = LinearLayoutManager(view.context) - adapter = AdapterInventory(viewModel.currentPlayer.items, listener , viewModel.currentPlayer) - } + viewModel.currentPlayer.observe(viewLifecycleOwner, Observer { + with(recyclerView) { + layoutManager = LinearLayoutManager(view.context) + adapter = AdapterInventory( + it.items, + listener, + it + ) + } + }) } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt index 681b076..03006de 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/MainActivity.kt @@ -4,21 +4,18 @@ import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View +import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat -import androidx.lifecycle.ViewModelProvider import androidx.navigation.findNavController import androidx.navigation.ui.NavigationUI import androidx.navigation.ui.setupWithNavController import com.example.shakecraft.services.OpenWeatherMapService import com.example.shakecraft.viewmodel.MainViewModel import com.google.android.material.bottomnavigation.BottomNavigationView -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext +import kotlinx.coroutines.* import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory @@ -26,8 +23,7 @@ import retrofit2.converter.gson.GsonConverterFactory class MainActivity: AppCompatActivity() { var isRaining = false - private lateinit var viewModel: MainViewModel - + private val model: MainViewModel by viewModels() @RequiresApi(Build.VERSION_CODES.R) private fun hideSystemUI() { @@ -48,8 +44,6 @@ class MainActivity: AppCompatActivity() { super.onCreate(savedInstanceState) hideSystemUI() setContentView(R.layout.activity_main) - viewModel = ViewModelProvider(this).get(MainViewModel::class.java) - val apiKey = "85a2724ad38b3994c2b7ebe1d239bbff" val cityName = "Clermont-Ferrand" @@ -60,10 +54,8 @@ class MainActivity: AppCompatActivity() { val openWeatherMapService = retrofit.create(OpenWeatherMapService::class.java) - GlobalScope.launch(Dispatchers.Main) { - val weatherResponse = withContext(Dispatchers.IO) { - openWeatherMapService.getCurrentWeather(cityName, apiKey) - } + CoroutineScope(Dispatchers.IO).launch { + val weatherResponse = openWeatherMapService.getCurrentWeather(cityName, apiKey) isRaining = weatherResponse.weather.any { it.main.contains("rain", ignoreCase = true) } diff --git a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/viewmodel/MainViewModel.kt b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/viewmodel/MainViewModel.kt index 1b93ebf..c66e0ef 100644 --- a/ShakeAndCraft/app/src/main/java/com/example/shakecraft/viewmodel/MainViewModel.kt +++ b/ShakeAndCraft/app/src/main/java/com/example/shakecraft/viewmodel/MainViewModel.kt @@ -1,13 +1,21 @@ package com.example.shakecraft.viewmodel +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.example.shakecraft.data.Stub import com.example.shakecraft.model.Boss -import com.example.shakecraft.model.Player +import com.example.shakecraft.model.Recipe class MainViewModel : ViewModel() { - var currentPlayer : Player = Stub().load() + var currentPlayer = MutableLiveData(Stub().load()) + + lateinit var currentBoss : Boss val isBossInitialized get() = this::currentBoss.isInitialized + + fun craft(recipe : Recipe){ + currentPlayer.value?.craft(recipe) + currentPlayer.value = currentPlayer.value + } } \ No newline at end of file