diff --git a/about/build.gradle.kts b/about/build.gradle.kts
index 1b2e9ef5..f06da9b3 100644
--- a/about/build.gradle.kts
+++ b/about/build.gradle.kts
@@ -50,6 +50,7 @@ dependencies {
implementation(Libs.materialComponents)
implementation(Libs.ktxCore)
implementation(Libs.constraintLayout)
+ implementation(Libs.navigation)
implementation(Libs.epoxy)
kapt(Libs.epoxyProcessor)
diff --git a/about/src/main/java/com/haroldadmin/moonshot/about/AboutFragment.kt b/about/src/main/java/com/haroldadmin/moonshot/about/AboutFragment.kt
index b3290242..2f4b96ae 100644
--- a/about/src/main/java/com/haroldadmin/moonshot/about/AboutFragment.kt
+++ b/about/src/main/java/com/haroldadmin/moonshot/about/AboutFragment.kt
@@ -13,6 +13,7 @@ import com.haroldadmin.moonshot.about.views.aboutDetailCard
import com.haroldadmin.moonshot.base.MoonShotFragment
import com.haroldadmin.moonshot.base.simpleController
import com.haroldadmin.moonshot.R as appR
+import androidx.navigation.fragment.findNavController
class AboutFragment : MoonShotFragment() {
@@ -114,6 +115,18 @@ class AboutFragment : MoonShotFragment() {
}
}
+ aboutDetailCard {
+ id("licenses")
+ header(R.string.openSourceLicensesDetailHeader)
+ message(R.string.openSourceLicensesDetailMessage)
+ icon(R.drawable.ic_law)
+ onDetailClick { _ ->
+ AboutFragmentDirections.viewLicenses().let {
+ findNavController().navigate(it)
+ }
+ }
+ }
+
if (BuildConfig.DEBUG) {
aboutDetailCard {
id("debug-build")
diff --git a/about/src/main/java/com/haroldadmin/moonshot/about/Licenses.kt b/about/src/main/java/com/haroldadmin/moonshot/about/Licenses.kt
new file mode 100644
index 00000000..a506c38c
--- /dev/null
+++ b/about/src/main/java/com/haroldadmin/moonshot/about/Licenses.kt
@@ -0,0 +1,23 @@
+package com.haroldadmin.moonshot.about
+
+val licenses = mapOf(
+ "Kotlin Programming Language" to "https://github.com/JetBrains/kotlin/blob/master/license/LICENSE.txt",
+ "Kotlin Coroutines" to "https://github.com/Kotlin/kotlinx.coroutines/blob/master/LICENSE.txt",
+ "Koin" to "https://github.com/InsertKoinIO/koin/blob/master/LICENSE",
+ "AndroidX" to "https://android.googlesource.com/platform/frameworks/support/+/androidx-master-dev/LICENSE.txt",
+ "Material Components for Android" to "https://github.com/material-components/material-components-android/blob/master/LICENSE",
+ "Vector" to "https://github.com/haroldadmin/Vector/blob/master/LICENSE",
+ "Epoxy" to "https://github.com/airbnb/epoxy/blob/master/LICENSE",
+ "Coil" to "https://github.com/coil-kt/coil/blob/master/LICENSE.txt",
+ "Lemniscate" to "https://github.com/VladimirWrites/Lemniscate/blob/master/LICENSE",
+ "Lottie" to "https://github.com/airbnb/lottie-android/blob/master/LICENSE",
+ "JodaTime" to "https://github.com/JodaOrg/joda-time/blob/master/LICENSE.txt",
+ "Retrofit" to "https://github.com/square/retrofit/blob/master/LICENSE.txt",
+ "OkHttp" to "https://github.com/square/okhttp/",
+ "NetworkResponseAdapter" to "https://github.com/haroldadmin/NetworkResponseAdapter/blob/master/LICENSE",
+ "Moshi" to "https://github.com/square/moshi/blob/master/LICENSE.txt",
+ "JUnit" to "https://junit.org/junit4/license.html",
+ "KotlinTest" to "https://github.com/kotlintest/kotlintest.git",
+ "MockK" to "https://github.com/mockk/mockk/blob/master/LICENSE",
+ "SpaceX-API" to "https://github.com/r-spacex/SpaceX-API/blob/master/LICENSE"
+)
diff --git a/about/src/main/java/com/haroldadmin/moonshot/about/LicensesFragment.kt b/about/src/main/java/com/haroldadmin/moonshot/about/LicensesFragment.kt
new file mode 100644
index 00000000..ea2e0308
--- /dev/null
+++ b/about/src/main/java/com/haroldadmin/moonshot/about/LicensesFragment.kt
@@ -0,0 +1,49 @@
+package com.haroldadmin.moonshot.about
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.DividerItemDecoration
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.airbnb.epoxy.EpoxyController
+import com.airbnb.epoxy.EpoxyRecyclerView
+import com.haroldadmin.moonshot.about.views.licenseView
+import com.haroldadmin.moonshot.base.MoonShotFragment
+import com.haroldadmin.moonshot.base.simpleController
+
+class LicensesFragment: MoonShotFragment() {
+
+ private lateinit var rvLicenses: EpoxyRecyclerView
+
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+ val root = inflater.inflate(R.layout.fragment_licenses, container, false)
+ rvLicenses = root.findViewById(R.id.rvLicenses)
+ rvLicenses.addItemDecoration(DividerItemDecoration(requireContext(), LinearLayoutManager.VERTICAL))
+ return root
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ rvLicenses.setControllerAndBuildModels(epoxyController)
+ }
+
+ private val epoxyController: EpoxyController = simpleController {
+ licenses.map { licenseEntry ->
+ licenseView {
+ id(licenseEntry.key)
+ license(licenseEntry.key)
+ onClick { _ ->
+ Intent().apply {
+ action = Intent.ACTION_VIEW
+ data = Uri.parse(licenseEntry.value)
+ }.also {
+ startActivity(it)
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/about/src/main/java/com/haroldadmin/moonshot/about/views/LicenseView.kt b/about/src/main/java/com/haroldadmin/moonshot/about/views/LicenseView.kt
new file mode 100644
index 00000000..edbd2914
--- /dev/null
+++ b/about/src/main/java/com/haroldadmin/moonshot/about/views/LicenseView.kt
@@ -0,0 +1,45 @@
+package com.haroldadmin.moonshot.about.views
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import androidx.appcompat.widget.AppCompatTextView
+import com.airbnb.epoxy.CallbackProp
+import com.airbnb.epoxy.ModelProp
+import com.airbnb.epoxy.ModelView
+import com.airbnb.epoxy.OnViewRecycled
+import com.haroldadmin.moonshot.about.R
+import com.haroldadmin.moonshot.utils.asyncText
+
+@ModelView(autoLayout = ModelView.Size.MATCH_WIDTH_WRAP_HEIGHT)
+class LicenseView @JvmOverloads constructor(
+ context: Context,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+ init {
+ inflate(context, R.layout.view_license, this)
+ }
+
+ private val license: AppCompatTextView = findViewById(R.id.license)
+
+ @ModelProp
+ fun setLicense(name: String) {
+ license.asyncText(name)
+ }
+
+ @CallbackProp
+ fun setOnClick(onClick: OnClickListener?) {
+ if (onClick != null) {
+ rootView.setOnClickListener(onClick)
+ }
+ }
+
+ @OnViewRecycled
+ fun cleanup() {
+ rootView.setOnClickListener(null)
+ }
+}
\ No newline at end of file
diff --git a/about/src/main/res/drawable/ic_law.xml b/about/src/main/res/drawable/ic_law.xml
new file mode 100644
index 00000000..0acfc8ba
--- /dev/null
+++ b/about/src/main/res/drawable/ic_law.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/about/src/main/res/layout/fragment_licenses.xml b/about/src/main/res/layout/fragment_licenses.xml
new file mode 100644
index 00000000..30b2b3d7
--- /dev/null
+++ b/about/src/main/res/layout/fragment_licenses.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
diff --git a/about/src/main/res/layout/view_license.xml b/about/src/main/res/layout/view_license.xml
new file mode 100644
index 00000000..f322f57a
--- /dev/null
+++ b/about/src/main/res/layout/view_license.xml
@@ -0,0 +1,12 @@
+
+
+
+
\ No newline at end of file
diff --git a/about/src/main/res/values/strings.xml b/about/src/main/res/values/strings.xml
index 202a5c40..dd1e3727 100644
--- a/about/src/main/res/values/strings.xml
+++ b/about/src/main/res/values/strings.xml
@@ -12,4 +12,7 @@
MoonShot is powered by the open source SpaceX API
Privacy Policy
Click here to read our privacy policy
+ Open Source Licenses
+ Licenses for Open Source libraries used in the app
+ Open Source Licenses
\ 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 27ca2ef3..da795b07 100644
--- a/app/src/main/res/navigation/nav_graph.xml
+++ b/app/src/main/res/navigation/nav_graph.xml
@@ -124,8 +124,21 @@
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f0b423cb..de70adfe 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -32,4 +32,5 @@
Launch
Unknown
Unknown
+ Licenses