diff --git a/app/src/main/java/com/example/palto/domain/Session.kt b/app/src/main/java/com/example/palto/domain/Session.kt index fef790f..e574b59 100644 --- a/app/src/main/java/com/example/palto/domain/Session.kt +++ b/app/src/main/java/com/example/palto/domain/Session.kt @@ -5,5 +5,7 @@ import java.io.Serializable * Data class that captures tokens for logged in users retrieved from LoginRepository */ data class Session( - val id: String + val id: Int, + val name: String, + var attendances: List ) \ No newline at end of file diff --git a/app/src/main/java/com/example/palto/ui/menu/MenuAdapter.kt b/app/src/main/java/com/example/palto/ui/menu/MenuAdapter.kt index d56a5ed..518c04f 100644 --- a/app/src/main/java/com/example/palto/ui/menu/MenuAdapter.kt +++ b/app/src/main/java/com/example/palto/ui/menu/MenuAdapter.kt @@ -12,35 +12,39 @@ import com.example.palto.domain.Session /** * A [ListAdapter] that can display [Session] items. */ -class MenuAdapter : +class MenuAdapter(private val onClick: (Session) -> Unit) : ListAdapter(SessionDiffCallback) { + inner class ViewHolder(binding: FragmentMenuItemBinding) : + RecyclerView.ViewHolder(binding.root) { + private val sessionNameText: TextView = binding.sessionName + private var currentSession: Session? = null + + init { + binding.root.setOnClickListener { + currentSession?.let { + onClick(it) + } + } + } + + fun bind(session: Session) { + currentSession = session + sessionNameText.text = session.name + } + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { - return ViewHolder( - FragmentMenuItemBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) + val binding = FragmentMenuItemBinding + .inflate(LayoutInflater.from(parent.context), parent, false) + return ViewHolder(binding) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = getItem(position) - holder.sessionId.text = item.id + holder.bind(item) } - inner class ViewHolder( - binding: FragmentMenuItemBinding - ) : RecyclerView.ViewHolder(binding.root) { - - val sessionId: TextView = binding.sessionId - override fun toString(): String { - return super.toString() + " '" + sessionId.text + "'" - } - } - - //override fun getItemCount(): Int = values.size + override fun getItemCount() = currentList.size } object SessionDiffCallback : DiffUtil.ItemCallback() { diff --git a/app/src/main/java/com/example/palto/ui/menu/MenuFragment.kt b/app/src/main/java/com/example/palto/ui/menu/MenuFragment.kt index dca0377..6aceecc 100644 --- a/app/src/main/java/com/example/palto/ui/menu/MenuFragment.kt +++ b/app/src/main/java/com/example/palto/ui/menu/MenuFragment.kt @@ -4,11 +4,15 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.core.os.bundleOf import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import androidx.navigation.navGraphViewModels import com.example.palto.R import com.example.palto.databinding.FragmentMenuListBinding +import com.example.palto.domain.Session +import com.example.palto.ui.UserViewModel /** * A fragment representing a list of Sessions. @@ -16,11 +20,13 @@ import com.example.palto.databinding.FragmentMenuListBinding class MenuFragment : Fragment() { private val menuViewModel: MenuViewModel by - navGraphViewModels(R.id.nav_graph) + navGraphViewModels(R.id.nav_graph) { MenuViewModel.Factory } + + private val userViewModel: UserViewModel by + activityViewModels() { UserViewModel.Factory } - private var _binding: FragmentMenuListBinding? = null // This property is only valid between onCreateView and onDestroyView - private val binding get() = _binding!! + private lateinit var binding: FragmentMenuListBinding override fun onCreateView( inflater: LayoutInflater, @@ -41,17 +47,25 @@ class MenuFragment : Fragment() { } // Display the list of sessions. - val adapter = MenuAdapter() + + // Create a new MenuAdapter (list) with the given function when clicking an item. + val adapter = MenuAdapter { adapterOnClick(it) } binding.menuList.adapter = adapter + // Link the adapter with the session list in the menuViewMode. menuViewModel.sessions.observe(viewLifecycleOwner) { adapter.submitList(it) } + // Bind the add button. binding.createSession.setOnClickListener { - menuViewModel.createSession() - findNavController().navigate(R.id.action_menuFragment_to_sessionFragment) + navController.navigate(R.id.action_menuFragment_to_newSessionFragment) } return binding.root } + + private fun adapterOnClick(session: Session) { + val bundle = bundleOf("session" to session.id) + findNavController().navigate(R.id.action_menuFragment_to_sessionFragment, bundle) + } } \ No newline at end of file diff --git a/app/src/main/java/com/example/palto/ui/menu/MenuViewModel.kt b/app/src/main/java/com/example/palto/ui/menu/MenuViewModel.kt index 859198b..b67bd65 100644 --- a/app/src/main/java/com/example/palto/ui/menu/MenuViewModel.kt +++ b/app/src/main/java/com/example/palto/ui/menu/MenuViewModel.kt @@ -4,18 +4,34 @@ import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.example.palto.data.repository.TokenRepository +import com.example.palto.data.repository.UserRepository import com.example.palto.domain.Session +import com.example.palto.ui.UserViewModel class MenuViewModel() : ViewModel() { private var _sessions = MutableLiveData>(emptyList()) - val sessions = _sessions as LiveData> + val sessions: LiveData> = _sessions - fun createSession() { + fun createSession(name: String) { + val list = _sessions.value ?: emptyList() val session = Session( - id = "aahh" + id = list.size, + name = name, + attendances = emptyList() ) - _sessions.value = (_sessions.value ?: emptyList()) + session - Log.d("PALTO", "MenuViewModel: a session has been added into the list.") + _sessions.value = list + session + Log.d("Palto", "MenuViewModel: A session has been added into the list.") + } + + companion object { + + val Factory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + return MenuViewModel() as T + } + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_menu_item.xml b/app/src/main/res/layout/fragment_menu_item.xml index dd0594e..92c931f 100644 --- a/app/src/main/res/layout/fragment_menu_item.xml +++ b/app/src/main/res/layout/fragment_menu_item.xml @@ -4,11 +4,17 @@ android:layout_height="wrap_content" android:orientation="horizontal"> - + android:textAppearance="?attr/textAppearanceListItem" />--> + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_menu_list.xml b/app/src/main/res/layout/fragment_menu_list.xml index 992f5ff..645676c 100644 --- a/app/src/main/res/layout/fragment_menu_list.xml +++ b/app/src/main/res/layout/fragment_menu_list.xml @@ -21,6 +21,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" + android:layout_margin="16dp" android:clickable="true" android:contentDescription="@string/create_session" app:srcCompat="@android:drawable/ic_input_add" /> diff --git a/app/src/main/res/layout/fragment_new_session.xml b/app/src/main/res/layout/fragment_new_session.xml new file mode 100644 index 0000000..d419ed9 --- /dev/null +++ b/app/src/main/res/layout/fragment_new_session.xml @@ -0,0 +1,33 @@ + + + + + +