From 33c1be510b76fe4d7599564985b0f635a02aa675 Mon Sep 17 00:00:00 2001 From: Rajit Deb Date: Wed, 25 Oct 2023 10:25:54 +0530 Subject: [PATCH] Fixed issue (#5) - Unnecessary use of Custom AppBar (#6) --- .idea/kotlinc.xml | 4 +- app/build.gradle | 33 +++---- .../main/java/dev/dsi/robust/MainActivity.kt | 24 ++++- .../java/dev/dsi/robust/SplashActivity.kt | 23 +++-- .../robust/fridge/Adapter/FridgeAdapter.kt | 17 ++-- .../robust/fridge/Database/FridgeDatabase.kt | 2 +- .../fridge/Database/FridgeRepository.kt | 3 - .../robust/fridge/Database/FridgeViewModel.kt | 10 +- .../fridge/Database/FridgeViewModelFactory.kt | 13 --- .../java/dev/dsi/robust/ui/AboutFragment.kt | 44 +++++---- .../java/dev/dsi/robust/ui/AddItemFragment.kt | 98 ++++++++----------- .../java/dev/dsi/robust/ui/FridgeFragment.kt | 39 ++++++-- .../java/dev/dsi/robust/ui/TipsFragment.kt | 21 ++-- app/src/main/res/layout/activity_main.xml | 24 ++++- app/src/main/res/layout/fragment_about.xml | 22 ----- app/src/main/res/layout/fragment_add_item.xml | 21 ---- app/src/main/res/layout/fragment_fridge.xml | 22 +---- app/src/main/res/layout/fragment_tips.xml | 21 ---- app/src/main/res/menu/bottom_nav_menu.xml | 3 - app/src/main/res/navigation/nav_graph.xml | 39 ++------ app/src/main/res/values-night/themes.xml | 4 +- app/src/main/res/values/themes.xml | 12 ++- build.gradle | 5 +- 23 files changed, 212 insertions(+), 292 deletions(-) delete mode 100644 app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModelFactory.kt diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index 7e340a7..c5d7cc0 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 7282516..6f51c45 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { defaultConfig { applicationId "dev.dsi.robust" - minSdk 26 + minSdk 21 targetSdk 33 versionCode 1 versionName "1.0" @@ -28,7 +28,6 @@ android { buildFeatures { viewBinding true - dataBinding true } compileOptions { @@ -48,32 +47,32 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.7.0' - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.6.0-alpha03' - implementation 'androidx.constraintlayout:constraintlayout:2.1.3' + implementation 'androidx.core:core-ktx:1.8.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' //navigation - implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1' - implementation 'androidx.navigation:navigation-ui-ktx:2.4.1' + implementation 'androidx.navigation:navigation-fragment-ktx:2.7.4' + implementation 'androidx.navigation:navigation-ui-ktx:2.7.4' //coroutines - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.1' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.2' //lifecycle - implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2" //recyclerview - implementation 'androidx.recyclerview:recyclerview:1.2.1' + implementation 'androidx.recyclerview:recyclerview:1.3.1' implementation "androidx.recyclerview:recyclerview-selection:1.2.0-alpha01" //room - def room_version = "2.4.2" + def room_version = "2.5.0" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" @@ -82,5 +81,5 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' //lottie - implementation "com.airbnb.android:lottie:4.2.2" + implementation "com.airbnb.android:lottie:6.1.0" } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/MainActivity.kt b/app/src/main/java/dev/dsi/robust/MainActivity.kt index 0f4b10e..facb2b1 100644 --- a/app/src/main/java/dev/dsi/robust/MainActivity.kt +++ b/app/src/main/java/dev/dsi/robust/MainActivity.kt @@ -1,15 +1,19 @@ package dev.dsi.robust +import android.graphics.Color import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.navigation.NavController +import androidx.navigation.findNavController import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupWithNavController import dev.dsi.robust.databinding.ActivityMainBinding class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private lateinit var navController: NavController override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -19,9 +23,27 @@ class MainActivity : AppCompatActivity() { val navHost = supportFragmentManager .findFragmentById(binding.navHostFragment.id) as NavHostFragment - val navController: NavController = navHost.navController + navController = navHost.navController + + val appBarConfiguration = AppBarConfiguration( + setOf( + R.id.fridgeFragment, + R.id.tipsFragment, + R.id.aboutFragment + ) + ) + + binding.toolbar.apply { + setTitleTextColor(Color.WHITE) + setupWithNavController(navController, appBarConfiguration) + } binding.bottomNav.setupWithNavController(navController) } + + override fun onSupportNavigateUp(): Boolean { + return navController.navigateUp() || super.onSupportNavigateUp() + } + } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/SplashActivity.kt b/app/src/main/java/dev/dsi/robust/SplashActivity.kt index 08ce690..ac71f04 100644 --- a/app/src/main/java/dev/dsi/robust/SplashActivity.kt +++ b/app/src/main/java/dev/dsi/robust/SplashActivity.kt @@ -1,23 +1,30 @@ package dev.dsi.robust import android.content.Intent -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import android.os.Handler +import androidx.appcompat.app.AppCompatActivity import dev.dsi.robust.databinding.ActivitySplashBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch class SplashActivity : AppCompatActivity() { + private lateinit var binding: ActivitySplashBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - window.setStatusBarColor(this.getResources().getColor(R.color.gradient_start)) + window.statusBarColor = this.resources.getColor(R.color.gradient_start) binding = ActivitySplashBinding.inflate(layoutInflater) - val view = binding.root - Handler().postDelayed({ - startActivity(Intent(this, MainActivity::class.java)) + + // Instead of Handler().postDelayed used coroutines + CoroutineScope(Dispatchers.Main).launch { + delay(1000) + startActivity(Intent(this@SplashActivity, MainActivity::class.java)) finish() - }, 1000) - setContentView(view) + } + + setContentView(binding.root) } } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/fridge/Adapter/FridgeAdapter.kt b/app/src/main/java/dev/dsi/robust/fridge/Adapter/FridgeAdapter.kt index 5cf5753..723a4cf 100644 --- a/app/src/main/java/dev/dsi/robust/fridge/Adapter/FridgeAdapter.kt +++ b/app/src/main/java/dev/dsi/robust/fridge/Adapter/FridgeAdapter.kt @@ -3,23 +3,18 @@ package dev.dsi.robust.fridge.Adapter import android.annotation.SuppressLint import android.content.Context import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.core.content.ContextCompat -import androidx.fragment.app.FragmentActivity import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import dev.dsi.robust.databinding.RecyclerViewItemBinding import dev.dsi.robust.fridge.Database.FridgeItems import dev.dsi.robust.fridge.Database.FridgeViewModel -import dev.dsi.robust.utils.Snacker class FridgeAdapter( - val fridgeViewModel: FridgeViewModel, - val parentView: View, - val activity: FragmentActivity?, + private val fridgeViewModel: FridgeViewModel ) : ListAdapter( ListDiffCallbacks() @@ -35,13 +30,15 @@ class FridgeAdapter( override fun onBindViewHolder(holder: FridgeViewHolder, position: Int) { val item = getItem(position) - holder.bind(item, fridgeViewModel, parentView) + holder.bind(item, fridgeViewModel) } - class FridgeViewHolder(val binding: RecyclerViewItemBinding, val context: Context) : - RecyclerView.ViewHolder(binding.root) { + class FridgeViewHolder( + private val binding: RecyclerViewItemBinding, + val context: Context + ) : RecyclerView.ViewHolder(binding.root) { - fun bind(item: FridgeItems, fridgeViewModel: FridgeViewModel, parentView: View) { + fun bind(item: FridgeItems, fridgeViewModel: FridgeViewModel) { binding.productName.text = item.itemName binding.expiry.text = item.itemExpiry diff --git a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeDatabase.kt b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeDatabase.kt index 677b636..19596fc 100644 --- a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeDatabase.kt +++ b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeDatabase.kt @@ -5,7 +5,7 @@ import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase -@Database(entities = [FridgeItems::class], version = 1) +@Database(entities = [FridgeItems::class], version = 1, exportSchema = false) abstract class FridgeDatabase : RoomDatabase() { abstract fun getFridgeDao(): FridgeDao diff --git a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeRepository.kt b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeRepository.kt index c3475a8..aa1083e 100644 --- a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeRepository.kt +++ b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeRepository.kt @@ -1,12 +1,9 @@ package dev.dsi.robust.fridge.Database import androidx.annotation.WorkerThread -import androidx.lifecycle.LiveData class FridgeRepository(private val fridgeDao: FridgeDao) { -// val alllists:LiveData>=getAllItems() - @WorkerThread suspend fun insert(items: FridgeItems) = fridgeDao.insert(items) diff --git a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModel.kt b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModel.kt index 428fcfb..4d674f3 100644 --- a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModel.kt +++ b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModel.kt @@ -6,7 +6,7 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import kotlinx.coroutines.* -class FridgeViewModel (application: Application):AndroidViewModel(Application()){ +class FridgeViewModel(application: Application) : AndroidViewModel(Application()) { private var parentJob = Job() private val scope = CoroutineScope(parentJob + Dispatchers.Main) @@ -20,17 +20,17 @@ class FridgeViewModel (application: Application):AndroidViewModel(Application()) allLists = getAllFridgeItems() } - fun insert(items:FridgeItems)=scope.launch { + fun insert(items: FridgeItems) = scope.launch { repository.insert(items) } - fun delete(items:FridgeItems)=scope.launch { + fun delete(items: FridgeItems) = scope.launch { repository.delete(items) } - fun update(items:FridgeItems)=scope.launch { + fun update(items: FridgeItems) = scope.launch { repository.update(items) } -fun getAllFridgeItems() = repository.getAllItems() + fun getAllFridgeItems() = repository.getAllItems() } diff --git a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModelFactory.kt b/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModelFactory.kt deleted file mode 100644 index d7a7a69..0000000 --- a/app/src/main/java/dev/dsi/robust/fridge/Database/FridgeViewModelFactory.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.dsi.robust.fridge.Database - -import android.app.Application -import android.view.ViewGroupOverlay -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider - -class FridgeViewModelFactory(private val repository: FridgeRepository):ViewModelProvider.NewInstanceFactory() { - - override fun create(modelClass: Class):T{ - return FridgeViewModel(Application()) as T - } -} diff --git a/app/src/main/java/dev/dsi/robust/ui/AboutFragment.kt b/app/src/main/java/dev/dsi/robust/ui/AboutFragment.kt index bf2b140..0b712fc 100644 --- a/app/src/main/java/dev/dsi/robust/ui/AboutFragment.kt +++ b/app/src/main/java/dev/dsi/robust/ui/AboutFragment.kt @@ -11,16 +11,10 @@ import android.widget.Toast import dev.dsi.robust.R import dev.dsi.robust.databinding.FragmentAboutBinding - class AboutFragment : Fragment() { - private var _binding: FragmentAboutBinding? = null - private val binding - get() = _binding!! - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - } + private var _binding: FragmentAboutBinding? = null + private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -28,65 +22,67 @@ class AboutFragment : Fragment() { ): View? { _binding = FragmentAboutBinding.inflate(inflater, container, false) - binding.toolbarDashboardFridge.setNavigationOnClickListener { - activity?.onBackPressed() - } //Madhur binding.textGithubOne.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://github.com/madhurmehta007") startActivity(openURL) } + binding.textLinkedInOne.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://www.linkedin.com/in/madhurmehta007/") startActivity(openURL) } //Debayan binding.textGithubTwo.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://github.com/debz-g") startActivity(openURL) } + binding.textLinkedInTwo.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://www.linkedin.com/in/debzexe/") startActivity(openURL) } //Saalim binding.textGithubThree.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://github.com/danascape") startActivity(openURL) } + binding.textLinkedInThree.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://www.linkedin.com/in/saalim-quadri/") startActivity(openURL) } //Manasvi binding.textGithubFour.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://github.com/Manasvikashyap") startActivity(openURL) } + binding.textGmailOne.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("mailto:manasvigk03@gmail.com") startActivity(openURL) } //Joyeeta binding.textGMailTwo.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("mailto:joyeeta2811.bais@gmail.com") startActivity(openURL) } + binding.textLinkedInFive.setOnClickListener { - val openURL = Intent(android.content.Intent.ACTION_VIEW) + val openURL = Intent(Intent.ACTION_VIEW) openURL.data = Uri.parse("https://www.linkedin.com/in/joyeeta-bais-722727231") startActivity(openURL) } @@ -95,6 +91,7 @@ class AboutFragment : Fragment() { binding.textGithub4.setOnClickListener { Toast.makeText(requireContext(),"Not yet updated", Toast.LENGTH_SHORT).show() } + binding.textLinkedIn4.setOnClickListener { Toast.makeText(requireContext(),"Not yet updated", Toast.LENGTH_SHORT).show() } @@ -102,4 +99,9 @@ class AboutFragment : Fragment() { return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/ui/AddItemFragment.kt b/app/src/main/java/dev/dsi/robust/ui/AddItemFragment.kt index 0636e7b..c86300b 100644 --- a/app/src/main/java/dev/dsi/robust/ui/AddItemFragment.kt +++ b/app/src/main/java/dev/dsi/robust/ui/AddItemFragment.kt @@ -2,12 +2,11 @@ package dev.dsi.robust.ui import android.app.DatePickerDialog import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.DatePicker -import androidx.lifecycle.ViewModelProviders +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import dev.dsi.robust.R import dev.dsi.robust.databinding.FragmentAddItemBinding @@ -16,14 +15,14 @@ import dev.dsi.robust.fridge.Database.FridgeViewModel import dev.dsi.robust.utils.Constants import dev.dsi.robust.utils.Snacker import java.text.SimpleDateFormat -import java.util.* +import java.util.Calendar +import java.util.Locale -@Suppress("DEPRECATION") class AddItemFragment : Fragment() { + private lateinit var fridgeViewmodel: FridgeViewModel private var _binding: FragmentAddItemBinding? = null - private val binding - get() = _binding!! + private val binding get() = _binding!! var cal = Calendar.getInstance() @@ -34,66 +33,38 @@ class AddItemFragment : Fragment() { ): View? { _binding = FragmentAddItemBinding.inflate(inflater, container, false) - binding.toolbarDashboardFridge.setNavigationOnClickListener { - activity?.onBackPressed() - } - - - - - fun updateDateInView() { - val myFormat = "MM/dd/yyyy" - val sdf = SimpleDateFormat(myFormat, Locale.US) - binding.calendarText.text = sdf.format(cal.getTime()) - } - - - val dateSetListener = object : DatePickerDialog.OnDateSetListener { - override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int, - dayOfMonth: Int) { - cal.set(Calendar.YEAR, year) - cal.set(Calendar.MONTH, monthOfYear) - cal.set(Calendar.DAY_OF_MONTH, dayOfMonth) - updateDateInView() - } + val dateSetListener = + DatePickerDialog.OnDateSetListener { _, year, monthOfYear, dayOfMonth -> + cal.set(Calendar.YEAR, year) + cal.set(Calendar.MONTH, monthOfYear) + cal.set(Calendar.DAY_OF_MONTH, dayOfMonth) + updateDateInView() } - binding.calendarCard.setOnClickListener(object : View.OnClickListener { - override fun onClick(view: View) { - DatePickerDialog(requireContext(), - dateSetListener, - cal.get(Calendar.YEAR), - cal.get(Calendar.MONTH), - cal.get(Calendar.DAY_OF_MONTH)).show() - } - - }) + binding.calendarCard.setOnClickListener { + DatePickerDialog( + requireContext(), + dateSetListener, + cal.get(Calendar.YEAR), + cal.get(Calendar.MONTH), + cal.get(Calendar.DAY_OF_MONTH) + ).show() + } binding.fabCheck.setOnClickListener { - fridgeViewmodel = ViewModelProviders.of(this).get(FridgeViewModel::class.java) - - if(binding.itemNameEditText.text.toString() == ""){ - Snacker(it,"Enter your item name").error() - } + fridgeViewmodel = ViewModelProvider(this)[FridgeViewModel::class.java] - else if(binding.itemCountEditText.text.toString() == ""){ + if (binding.itemNameEditText.text.toString() == "") { + Snacker(it, "Enter your item name").error() + } else if (binding.itemCountEditText.text.toString() == "") { Snacker(it, "Enter the quantity you want to store").error() - } - - else if(binding.calendarText.text.toString() == ""){ + } else if (binding.calendarText.text.toString() == "") { Snacker(it, "Select expiry date").error() - } - - else if(binding.itemCountEditText.text.toString() == ""){ + } else if (binding.itemCountEditText.text.toString() == "") { Snacker(it, "Enter the quantity you want to store").error() - } - - else if(binding.itemTag.selectedItem.toString() == ""){ + } else if (binding.itemTag.selectedItem.toString() == "") { Snacker(it, "Please select a tag").error() - } - - - else { + } else { val fridge = FridgeItems( itemName = binding.itemNameEditText.text.toString(), itemExpiry = binding.calendarText.text.toString(), @@ -103,6 +74,7 @@ class AddItemFragment : Fragment() { ) fridge.id = System.currentTimeMillis().toInt() fridgeViewmodel.insert(fridge) + findNavController().navigate(R.id.action_addItemFragment_to_fridgeFragment) } } @@ -111,5 +83,15 @@ class AddItemFragment : Fragment() { return binding.root } + private fun updateDateInView() { + val myFormat = "MM/dd/yyyy" + val sdf = SimpleDateFormat(myFormat, Locale.US) + binding.calendarText.text = sdf.format(cal.time) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/ui/FridgeFragment.kt b/app/src/main/java/dev/dsi/robust/ui/FridgeFragment.kt index 141c33e..cbf4f18 100644 --- a/app/src/main/java/dev/dsi/robust/ui/FridgeFragment.kt +++ b/app/src/main/java/dev/dsi/robust/ui/FridgeFragment.kt @@ -1,12 +1,11 @@ package dev.dsi.robust.ui import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.appcompat.app.AlertDialog -import androidx.lifecycle.Observer +import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper @@ -20,13 +19,13 @@ import dev.dsi.robust.fridge.Database.FridgeItems import dev.dsi.robust.fridge.Database.FridgeViewModel import dev.dsi.robust.utils.SwipeToDeleteCallback - class FridgeFragment : Fragment() { + private lateinit var fridgeViewModel: FridgeViewModel lateinit var fridgeAdapter: FridgeAdapter + private var _binding: FragmentFridgeBinding? = null - private val binding - get() = _binding!! + private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -36,33 +35,46 @@ class FridgeFragment : Fragment() { _binding = FragmentFridgeBinding.inflate(inflater, container, false) fridgeViewModel = ViewModelProvider(this)[FridgeViewModel::class.java] - fridgeAdapter = FridgeAdapter(fridgeViewModel, binding.rv.rootView, activity) - binding.rv.adapter = fridgeAdapter - binding.rv.layoutManager = LinearLayoutManager(context) + + fridgeAdapter = FridgeAdapter(fridgeViewModel) + + binding.rv.apply { + adapter = fridgeAdapter + layoutManager = LinearLayoutManager(context) + } + enableSwipeToDeleteAndUndo(fridgeAdapter) - fridgeViewModel.allLists.observe(viewLifecycleOwner, Observer { list -> + fridgeViewModel.allLists.observe(viewLifecycleOwner) { list -> + if (list.isEmpty()) { binding.anim.visibility = View.VISIBLE } else { binding.anim.visibility = View.GONE } + fridgeAdapter.submitList(list) fridgeAdapter.fridgeList = list as ArrayList - }) + } binding.fabAddItem.setOnClickListener { findNavController().navigate(R.id.action_fridgeFragment_to_addItemFragment) } + return binding.root } private fun enableSwipeToDeleteAndUndo(fridgeAdapter: FridgeAdapter) { + val swipeToDeleteCallback = object : SwipeToDeleteCallback(context) { + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, i: Int) { + val position = viewHolder.adapterPosition fridgeAdapter.removeitem(position) + val item = fridgeAdapter.getList()[position] + AlertDialog.Builder(requireContext()) .setTitle("Delete") .setMessage("Are you sure you want to delete?") @@ -82,7 +94,14 @@ class FridgeFragment : Fragment() { .show() } } + val itemTouchhelper = ItemTouchHelper(swipeToDeleteCallback) itemTouchhelper.attachToRecyclerView(binding.rv) } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + } \ No newline at end of file diff --git a/app/src/main/java/dev/dsi/robust/ui/TipsFragment.kt b/app/src/main/java/dev/dsi/robust/ui/TipsFragment.kt index ffeb84a..b52b0ab 100644 --- a/app/src/main/java/dev/dsi/robust/ui/TipsFragment.kt +++ b/app/src/main/java/dev/dsi/robust/ui/TipsFragment.kt @@ -1,35 +1,28 @@ package dev.dsi.robust.ui import android.os.Bundle -import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import dev.dsi.robust.R -import dev.dsi.robust.databinding.FragmentAboutBinding +import androidx.fragment.app.Fragment import dev.dsi.robust.databinding.FragmentTipsBinding - class TipsFragment : Fragment() { - private var _binding: FragmentTipsBinding? = null - private val binding - get() = _binding!! - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - } + private var _binding: FragmentTipsBinding? = null + private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentTipsBinding.inflate(inflater, container, false) - binding.toolbarDashboardFridge.setNavigationOnClickListener { - activity?.onBackPressed() - } return binding.root } + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } } \ 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 8e3c967..357d352 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,6 +6,23 @@ android:layout_height="match_parent" tools:context=".MainActivity"> + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/menu/bottom_nav_menu.xml b/app/src/main/res/menu/bottom_nav_menu.xml index 78a0c0a..ad9021d 100644 --- a/app/src/main/res/menu/bottom_nav_menu.xml +++ b/app/src/main/res/menu/bottom_nav_menu.xml @@ -6,21 +6,18 @@ android:id="@+id/fridgeFragment" android:title="@string/fridge" android:icon="@drawable/fridge_icon" - android:iconTint="@color/black" app:showAsAction="ifRoom"/> \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 49db4ba..ef5723a 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -8,54 +8,33 @@ - - + android:label="About" + tools:layout="@layout/fragment_about"/> - - + android:label="Tips" + tools:layout="@layout/fragment_tips"/> - - + app:destination="@id/addItemFragment" /> + app:popUpToInclusive="false" /> \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index c7cb518..bbfa502 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -3,14 +3,14 @@ \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 9b4aaf0..ce99b31 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -2,15 +2,21 @@ + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 759b2f9..2dc7b1f 100644 --- a/build.gradle +++ b/build.gradle @@ -1,12 +1,15 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + + ext.kotlin_version = "1.8.0" + repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' - classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.21' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files