From 1a9e076bc1ee18d6eadf80cffb4aff2414526142 Mon Sep 17 00:00:00 2001 From: Kshitij Chauhan Date: Fri, 4 Oct 2019 23:50:59 +0530 Subject: [PATCH] feat: Add open sources licenses section in About page Fixes #15 --- about/build.gradle.kts | 1 + .../moonshot/about/AboutFragment.kt | 13 +++++ .../haroldadmin/moonshot/about/Licenses.kt | 23 +++++++++ .../moonshot/about/LicensesFragment.kt | 49 +++++++++++++++++++ .../moonshot/about/views/LicenseView.kt | 45 +++++++++++++++++ about/src/main/res/drawable/ic_law.xml | 10 ++++ .../src/main/res/layout/fragment_licenses.xml | 15 ++++++ about/src/main/res/layout/view_license.xml | 12 +++++ about/src/main/res/values/strings.xml | 3 ++ app/src/main/res/navigation/nav_graph.xml | 13 +++++ app/src/main/res/values/strings.xml | 1 + 11 files changed, 185 insertions(+) create mode 100644 about/src/main/java/com/haroldadmin/moonshot/about/Licenses.kt create mode 100644 about/src/main/java/com/haroldadmin/moonshot/about/LicensesFragment.kt create mode 100644 about/src/main/java/com/haroldadmin/moonshot/about/views/LicenseView.kt create mode 100644 about/src/main/res/drawable/ic_law.xml create mode 100644 about/src/main/res/layout/fragment_licenses.xml create mode 100644 about/src/main/res/layout/view_license.xml 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