Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ dependencies {
// Koin for JUnit 4
androidTestImplementation "io.insert-koin:koin-test-junit4:3.4.0"

// mockito
// Mockito
testImplementation "org.mockito:mockito-core:5.2.0"
testImplementation "org.mockito.kotlin:mockito-kotlin:4.1.0"
androidTestImplementation 'org.mockito:mockito-android:5.2.0'
Expand All @@ -109,6 +109,13 @@ dependencies {
implementation 'com.google.android.gms:play-services-maps:18.1.0'
implementation 'com.google.android.gms:play-services-location:21.0.1'

// Paging
implementation("androidx.paging:paging-runtime:3.1.1")
testImplementation("androidx.paging:paging-common:3.1.1")

// Coil
implementation("io.coil-kt:coil:2.3.0")

}

tasks.withType(Test) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class MainActivityTest {
12,
"User 1",
5,
null, "user 1 description", "123456789",
"user 1 description", "123456789",
"user1@email.com", profilePictureMetadata = userPhotoMetadata)
private val user2 = User(
userId2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ class FirebaseDBTest {

@Test
fun retrieveUserAfterSetShouldMatch() {
val user = User("1", 100, "User Test", 10, null, "description", "0076286372", "test@email.com", 1, null, null)
val user = User("1", 100, "User Test", 10, "description", "0076286372", "test@email.com", 1, null, null)

runBlocking {
FirebaseDB.addUser(user, user.id)
Expand Down Expand Up @@ -155,14 +155,14 @@ class FirebaseDBTest {
@Test
fun getImageWithEmptyPhotoIdReturnNull() {
runBlocking {
assertThat(FirebaseDB.getImage(PhotoMetadata(), 1), nullValue())
assertThat(FirebaseDB.getImage(PhotoMetadata(), "1"), nullValue())
}
}

@Test
fun getProfilePictureEmptyPhotoIdReturnNull() {
runBlocking {
assertThat(FirebaseDB.getImage(PhotoMetadata(), 1), nullValue())
assertThat(FirebaseDB.getImage(PhotoMetadata(), "1"), nullValue())
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.github.sdp_begreen.begreen.fragments

import android.graphics.BitmapFactory
import android.os.Bundle
import androidx.fragment.app.testing.FragmentScenario
import androidx.paging.ExperimentalPagingApi
import androidx.test.espresso.Espresso
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.ext.junit.rules.ActivityScenarioRule
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.activities.MainActivity
import com.github.sdp_begreen.begreen.firebase.DB
import com.github.sdp_begreen.begreen.models.ParcelableDate
import com.github.sdp_begreen.begreen.models.PhotoMetadata
import com.github.sdp_begreen.begreen.models.User
import com.github.sdp_begreen.begreen.rules.KoinTestRule
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.withContext
import org.junit.BeforeClass
import org.junit.Rule
import org.junit.Test
import org.koin.dsl.module
import org.mockito.ArgumentMatchers.any
import org.mockito.Mockito
import java.net.URL
import java.util.Date

class DynamicFeedFragmentTest {

companion object {
private val db: DB = Mockito.mock(DB::class.java)
private val posts = listOf(PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"), PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"), PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"), PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"), PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"), PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user", "type", "desc"))
private val user1 = User("user1", 100, "user1", 100)
private val user2 = User("user1", 100, "user1", 100, posts = listOf(PhotoMetadata("id", "title", ParcelableDate(date = Date()), "user2", "type", "desc")))
private val user = User("user", 100, "user1", 100,
"description", "007",
"mail", 100, listOf(user1),
listOf(user2))
val url = URL("https://picsum.photos/400")

@OptIn(ExperimentalCoroutinesApi::class)
@BeforeClass
@JvmStatic
fun setUp() {
// The implementation need to be provided before the rule is executed,
// that's why we do it in the beforeClass method
runTest {
Mockito.`when`(db.getUser("user")).thenReturn(user)
Mockito.`when`(db.getUser("user1")).thenReturn(user1)
Mockito.`when`(db.getUser("user2")).thenReturn(user2)

Mockito.`when`(db.getImage(any(), any())).thenReturn(BitmapFactory.decodeStream(
withContext(Dispatchers.IO) {
withContext(Dispatchers.IO) {
url.openConnection()
}.getInputStream()
}))
}
}
}

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)


@get:Rule
val koinTestRule = KoinTestRule(
modules = listOf(module {
single { db }
})
)

@OptIn(ExperimentalPagingApi::class)
@Test
fun test() {
// Launch fragment with arguments
val scenario = FragmentScenario.launchInContainer(DynamicFeedFragment::class.java)
Espresso.onView(ViewMatchers.withId(R.id.))
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ class ProfileDetailsFragmentTest {
142,
"Alice",
56,
photos[0],
"Description poutou poutou",
"08920939459802",
"cc@gmail.com",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.test.filters.LargeTest
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.models.User
import com.github.sdp_begreen.begreen.activities.MainActivity
import com.github.sdp_begreen.begreen.adapters.UserViewAdapter
import com.github.sdp_begreen.begreen.rules.KoinTestRule
import junit.framework.TestCase.*
import org.hamcrest.CoreMatchers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.models.User
import com.github.sdp_begreen.begreen.activities.MainActivity
import com.github.sdp_begreen.begreen.adapters.UserPhotosViewAdapter
import com.github.sdp_begreen.begreen.models.ParcelableDate
import com.github.sdp_begreen.begreen.models.PhotoMetadata
import com.github.sdp_begreen.begreen.rules.KoinTestRule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,15 @@ package com.github.sdp_begreen.begreen.fragments

import android.widget.LinearLayout
import androidx.fragment.app.commit
import androidx.test.espresso.Espresso
import androidx.test.espresso.action.ViewActions
import androidx.test.espresso.assertion.ViewAssertions
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.assertThat
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.platform.app.InstrumentationRegistry
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.activities.MainActivity
import com.github.sdp_begreen.begreen.databinding.FragmentUserPhotoBinding
import com.github.sdp_begreen.begreen.adapters.UserPhotosViewAdapter
import com.github.sdp_begreen.begreen.models.ParcelableDate
import com.github.sdp_begreen.begreen.models.PhotoMetadata
import com.github.sdp_begreen.begreen.models.User
import com.github.sdp_begreen.begreen.rules.KoinTestRule
import org.hamcrest.CoreMatchers
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert
import org.junit.Rule
import org.junit.Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import org.junit.Test
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.rules.KoinTestRule
import androidx.lifecycle.testing.TestLifecycleOwner
import com.github.sdp_begreen.begreen.adapters.UserViewAdapter

class UserViewAdapterTest {
@get:Rule
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ class UserTest {
0,
"Test",
0,
null,
"desc",
"phone",
"email",
Expand All @@ -30,7 +29,6 @@ class UserTest {
33,
"Alice",
1,
photoMetadata,
"Description poutou poutou",
"cc@gmail.com",
"08920939459802",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.github.sdp_begreen.begreen.firebase.Auth
import com.github.sdp_begreen.begreen.firebase.DB
import com.github.sdp_begreen.begreen.firebase.FirebaseAuth
import com.github.sdp_begreen.begreen.firebase.FirebaseDB
import com.google.firebase.database.FirebaseDatabase
import org.koin.android.ext.koin.androidContext
import org.koin.core.context.startKoin
import org.koin.dsl.module
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class DatabaseActivity : AppCompatActivity() {
bitmap.eraseColor(Color.RED)

lifecycleScope.launch {
imageId = FirebaseDB.addImage(bitmap, 3,
imageId = FirebaseDB.addImage(bitmap, "3",
PhotoMetadata(null, null, null, null,"Plastic bottle",null))
}
}
Expand All @@ -57,7 +57,7 @@ class DatabaseActivity : AppCompatActivity() {
findViewById<Button>(R.id.databaseLoadPicture).setOnClickListener {
lifecycleScope.launch {
imageId?.also {
FirebaseDB.getImage(it, 3).also { bitmap ->
FirebaseDB.getImage(it, "3").also { bitmap ->
findViewById<ImageView>(R.id.databasePicture).setImageBitmap(bitmap)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ import androidx.fragment.app.commit
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.paging.ExperimentalPagingApi
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.models.PhotoMetadata
import com.github.sdp_begreen.begreen.firebase.Auth
import com.github.sdp_begreen.begreen.firebase.DB
import com.github.sdp_begreen.begreen.fragments.AdviceFragment
import com.github.sdp_begreen.begreen.fragments.CameraFragment
import com.github.sdp_begreen.begreen.fragments.DynamicFeedFragment
import com.github.sdp_begreen.begreen.fragments.FollowersFragment
import com.github.sdp_begreen.begreen.fragments.MapFragment
import com.github.sdp_begreen.begreen.fragments.ProfileDetailsFragment
Expand Down Expand Up @@ -183,12 +185,14 @@ class MainActivity : AppCompatActivity() {
* @param drawerLayout The drawer layout to interact which in the case of the
* user menu being clicked
*/
@OptIn(ExperimentalPagingApi::class)
private fun handleBottomMenuItemClicked(item: MenuItem, drawerLayout: DrawerLayout) {
when (item.itemId) {
R.id.bottomMenuFeed -> {
item.setIcon(R.drawable.ic_baseline_feed)
val photos = listOf(PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"), PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"))
replaceFragInMainContainer(UserPhotoFragment.newInstance(1, photos, true))
//val photos = listOf(PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"), PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"),PhotoMetadata("1","Look at me cleaning!", ParcelableDate(Date()), "0", "Organique","Wowa je suis incroyable en train de ramasser cette couche usagée pour faire un selfie avec!"))
//replaceFragInMainContainer(UserPhotoFragment.newInstance(1, photos, true))
replaceFragInMainContainer(DynamicFeedFragment(true))
}
R.id.bottomMenuMap -> {
item.setIcon(R.drawable.ic_baseline_map)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package com.github.sdp_begreen.begreen.adapters

import android.graphics.BitmapFactory
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.lifecycle.LifecycleCoroutineScope
import androidx.lifecycle.lifecycleScope
import androidx.paging.PagingDataAdapter
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import coil.load
import coil.request.ImageRequest
import com.github.sdp_begreen.begreen.R
import com.github.sdp_begreen.begreen.firebase.DB
import com.github.sdp_begreen.begreen.firebase.FirebaseDB
import com.github.sdp_begreen.begreen.models.PhotoMetadata
import com.github.sdp_begreen.begreen.models.User
import kotlinx.coroutines.launch
import org.koin.android.ext.android.inject
import org.koin.java.KoinJavaComponent.inject
import java.net.URL

class FeedViewAdapter (private val isFeed: Boolean, private val lifecycleScope: LifecycleCoroutineScope) :
PagingDataAdapter<PhotoMetadata, RecyclerView.ViewHolder>(REPO_COMPARATOR) {

companion object {
/**
* comparator for the recyclerview
*/
private val REPO_COMPARATOR = object : DiffUtil.ItemCallback<PhotoMetadata>() {
override fun areItemsTheSame(oldItem: PhotoMetadata, newItem: PhotoMetadata): Boolean =
oldItem == newItem

override fun areContentsTheSame(oldItem: PhotoMetadata, newItem: PhotoMetadata): Boolean =
oldItem == newItem
}
}

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
(holder as? FeedViewHolder)?.bind(item = getItem(position))
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return FeedViewHolder.getInstance(parent, lifecycleScope, isFeed)
}

/**
* View holder class
* @param view (View) : view to be inflated
*/
class FeedViewHolder( view: View,
private val lifecycleScope: LifecycleCoroutineScope,
private val isFeed: Boolean) : RecyclerView.ViewHolder(view) {

private val db by inject<DB>(FirebaseDB::class.java)

companion object {

/**
* function to get the instance of the view holder
* @param parent (ViewGroup) : parent view
* @return (FeedViewHolder) : instance of the view holder
*/
fun getInstance(parent: ViewGroup, lifecycleScope: LifecycleCoroutineScope, isFeed: Boolean): FeedViewHolder {
val inflater = LayoutInflater.from(parent.context)
val view = inflater.inflate(R.layout.fragment_user_photo, parent, false)
return FeedViewHolder(view, lifecycleScope, isFeed)
}
}

val avatarView: ImageView = view.findViewById(R.id.avatar_image)
val titleView: TextView = view.findViewById(R.id.title_text)
val subtitleView: TextView = view.findViewById(R.id.subtitle_text)
val photoView: ImageView = view.findViewById(R.id.media_image)
val descriptionView: TextView = view.findViewById(R.id.supporting_text)

/**
* function to bind the data to the view
* @param item (PhotoMetadata?) : data to be bound
*/
fun bind(item: PhotoMetadata?) {
if(isFeed) {
//Display avatar if on feed
val drawable = ContextCompat.getDrawable(itemView.context , R.drawable.ic_baseline_person)
val defaultAvatar = drawable?.toBitmap()
//holder.avatarView.setImageBitmap(getFromDB(photo) ?: defaultAvatar)
avatarView.setImageBitmap( defaultAvatar)
lifecycleScope.launch {
val img = User.currentUser.let { user ->
user.profilePictureMetadata?.let { pMetadata ->
db.getUserProfilePicture(pMetadata, user.id)
}
}
?: defaultAvatar
avatarView.load(img)
}
}
val url = URL("https://picsum.photos/400")
//loads image from network using coil extension function
photoView.load(url) {
placeholder(R.drawable.blank_profile_picture)
}
titleView.text = item?.title
subtitleView.text =
(item?.takenOn?.toString() ?: "Unknown date") + " | " + (item?.category ?: "")
descriptionView.text = item?.description
}
}


}
Loading