diff --git a/app/build.gradle b/app/build.gradle index 72b7214..cf71fb0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ plugins { } ext { - testIntegrationVersion = '1.5.0' + testIntegrationVersion = '1.6.0' } android { @@ -64,8 +64,11 @@ dependencies { implementation 'com.google.firebase:firebase-analytics' testImplementation 'junit:junit:4.13.2' testImplementation 'io.mockk:mockk:1.13.8' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + androidTestImplementation 'androidx.test.ext:junit:1.2.0' + //TODO: Remove debugImplementation since it is a temporal fix to this Junit issue: + //https://github.com/android/android-test/issues/1755 + debugImplementation 'androidx.tracing:tracing:1.2.0' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.0' androidTestImplementation "androidx.test:runner:$testIntegrationVersion" androidTestImplementation "androidx.test:rules:$testIntegrationVersion" } diff --git a/app/src/androidTest/java/com/josdem/fruitypedia/MainNavigationTest.kt b/app/src/androidTest/java/com/josdem/fruitypedia/MainNavigationTest.kt index e8e697d..7cba024 100644 --- a/app/src/androidTest/java/com/josdem/fruitypedia/MainNavigationTest.kt +++ b/app/src/androidTest/java/com/josdem/fruitypedia/MainNavigationTest.kt @@ -4,6 +4,7 @@ import androidx.test.espresso.Espresso.onData import androidx.test.espresso.Espresso.onView import androidx.test.espresso.action.ViewActions.click import androidx.test.espresso.assertion.ViewAssertions.matches +import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed import androidx.test.espresso.matcher.ViewMatchers.isDisplayed import androidx.test.espresso.matcher.ViewMatchers.withId import androidx.test.ext.junit.rules.ActivityScenarioRule @@ -11,8 +12,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest import com.josdem.fruitypedia.model.Category import org.hamcrest.Matchers.allOf +import org.hamcrest.Matchers.equalTo import org.hamcrest.Matchers.instanceOf import org.hamcrest.Matchers.`is` +import org.hamcrest.collection.IsMapContaining.hasEntry import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -32,5 +35,17 @@ class MainNavigationTest { val beverages = onView(allOf(withId(R.id.listViewBeverages))) beverages.check(matches(isDisplayed())) + + val beverage = + onData( + allOf( + `is`(instanceOf(Map::class.java)), + hasEntry( + equalTo("NAME"), + `is`("Anti-constipation Smoothie"), + ), + ), + ) + beverage.check(matches(isCompletelyDisplayed())) } } diff --git a/app/src/main/java/com/josdem/fruitypedia/BeverageFragment.kt b/app/src/main/java/com/josdem/fruitypedia/BeverageFragment.kt index 07e5e1b..a060da5 100644 --- a/app/src/main/java/com/josdem/fruitypedia/BeverageFragment.kt +++ b/app/src/main/java/com/josdem/fruitypedia/BeverageFragment.kt @@ -22,10 +22,11 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.ArrayAdapter import android.widget.ListView import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController +import com.google.common.collect.Maps +import com.josdem.fruitypedia.adapter.BeverageAdapter import com.josdem.fruitypedia.databinding.FragmentBeverageBinding import com.josdem.fruitypedia.model.Beverage import com.josdem.fruitypedia.service.FruityService @@ -37,7 +38,12 @@ import kotlinx.coroutines.launch class BeverageFragment : Fragment() { private var _binding: FragmentBeverageBinding? = null private val binding get() = _binding!! - private val fruityService: FruityService = RetrofitHelper.getInstance().create(FruityService::class.java) + private val fruityService: FruityService = + RetrofitHelper.getInstance().create(FruityService::class.java) + + private val id: String = "ID" + private val name: String = "NAME" + private var data: MutableList> = mutableListOf() override fun onCreateView( inflater: LayoutInflater, @@ -61,27 +67,46 @@ class BeverageFragment : Fragment() { val result = fruityService.getBeverages(ApplicationState.getValue("currentCategory") as Int) Log.d("beverages: ", result.body().toString()) - displayResults(result.body()) + populateData(result.body()) + printData() + displayResults() } } } - private fun displayResults(beverages: List?) { + private fun makeItem(beverage: Beverage): MutableMap { + val dataRow: MutableMap = Maps.newHashMap() + dataRow[beverage.id.toString()] = beverage.name + return dataRow + } + + private fun populateData(beverages: List?) { + beverages?.forEach { beverage -> + data.add(makeItem(beverage)) + } + } + + private fun printData() { + Log.d("data size: ", "size: " + data.size.toString()) + data.forEach { + Log.d("item:", it.toString()) + } + } + + private fun displayResults() { val listView = view?.findViewById(R.id.listViewBeverages) as ListView + val from = arrayOf(id, name) + val to = intArrayOf(R.id.beverageIdTextView, R.id.beverageTextView) - val arrayAdapter: ArrayAdapter = - ArrayAdapter( - view!!.context, - R.layout.list_beverage, - R.id.beverageTextView, - beverages as MutableList, - ) - listView.adapter = arrayAdapter + val simpleAdapter = + this.context?.let { BeverageAdapter(it, data, R.layout.list_beverage, from, to) } + listView.adapter = simpleAdapter listView.setOnItemClickListener { parent, view, position, id -> - val beverage = arrayAdapter.getItem(position) - Log.d("element: $beverage", "was selected") - beverage?.id?.let { ApplicationState.storeValue("currentBeverage", it) } + val item = simpleAdapter?.getItem(position) + Log.d("element:", "$item was selected") + val entry = item.toString().replace("{", "").replace("}", "").split("=") + ApplicationState.storeValue("currentBeverage", Integer.valueOf(entry[0])) findNavController().navigate(R.id.action_SecondFragment_to_ThirdFragment) } } diff --git a/app/src/main/java/com/josdem/fruitypedia/adapter/BeverageAdapter.kt b/app/src/main/java/com/josdem/fruitypedia/adapter/BeverageAdapter.kt new file mode 100644 index 0000000..0ba6e95 --- /dev/null +++ b/app/src/main/java/com/josdem/fruitypedia/adapter/BeverageAdapter.kt @@ -0,0 +1,54 @@ +/* +Copyright 2024 Jose Morales contact@josdem.io + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. + */ + +package com.josdem.fruitypedia.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.SimpleAdapter +import android.widget.TextView +import com.josdem.fruitypedia.R + +class BeverageAdapter( + context: Context, + data: MutableList>, + resource: Int, + from: Array, + to: IntArray, +) : SimpleAdapter(context, data, resource, from, to) { + private val inflater: LayoutInflater = + context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater + + override fun getView( + position: Int, + convertView: View?, + parent: ViewGroup, + ): View { + if (convertView == null) { + val view = inflater.inflate(R.layout.list_beverage, parent, false) + val textView: TextView = view.findViewById(R.id.beverageIdTextView) + val nameView: TextView = view.findViewById(R.id.beverageTextView) + val entry = this.getItem(position).toString().replace("{", "").replace("}", "").split("=") + textView.text = entry[0] + nameView.text = entry[1] + return view + } + return convertView + } +} diff --git a/app/src/main/res/layout/fragment_beverage.xml b/app/src/main/res/layout/fragment_beverage.xml index e84a9b4..31e3e86 100644 --- a/app/src/main/res/layout/fragment_beverage.xml +++ b/app/src/main/res/layout/fragment_beverage.xml @@ -6,14 +6,6 @@ android:layout_height="match_parent" tools:context=".BeverageFragment"> - - - \ No newline at end of file + + + + + + + \ No newline at end of file