diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 871e9da..5cce9b4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,10 +23,16 @@
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/eu/depau/etchdroid/activities/LicensesActivity.kt b/app/src/main/java/eu/depau/etchdroid/activities/LicensesActivity.kt
new file mode 100644
index 0000000..0f81157
--- /dev/null
+++ b/app/src/main/java/eu/depau/etchdroid/activities/LicensesActivity.kt
@@ -0,0 +1,74 @@
+package eu.depau.etchdroid.activities
+
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import android.support.v7.widget.LinearLayoutManager
+import android.support.v7.widget.RecyclerView
+import android.util.Log
+import android.view.MenuItem
+import android.view.View
+import eu.depau.etchdroid.R
+import eu.depau.etchdroid.adapters.LicenseRecyclerViewAdapter
+import eu.depau.etchdroid.utils.ClickListener
+import eu.depau.etchdroid.utils.License
+import eu.depau.etchdroid.utils.RecyclerViewTouchListener
+import kotlinx.android.synthetic.main.activity_licenses.*
+
+
+class LicensesActivity : AppCompatActivity() {
+ private lateinit var recyclerView: RecyclerView
+ private lateinit var viewManager: RecyclerView.LayoutManager
+ private lateinit var viewAdapter: LicenseRecyclerViewAdapter
+
+ lateinit var licenses: Array
+
+ private fun updateLicenses() {
+ if (!::licenses.isInitialized) {
+ licenses = arrayOf(
+ License(getString(R.string.this_app), Uri.parse("https://github.com/Depau/EtchDroid"), getString(R.string.license_gpl3)),
+ License("libaums (fork)", Uri.parse("https://github.com/Depau/libaums"), getString(R.string.license_apache2_0), getString(R.string.libaums_license_desc)),
+ License("dmg2img (fork)", Uri.parse("https://github.com/Depau/dmg2img-cmake"), getString(R.string.license_gpl2), getString(R.string.dmg2img_license_desc)),
+ License("bzip2", Uri.parse("https://github.com/LuaDist/bzip2/"), getString(R.string.license_bzip2)),
+ License("LibreSSL", Uri.parse("https://github.com/libressl-portable/portable"), getString(R.string.license_custom))
+ )
+ }
+ }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_licenses)
+ updateLicenses()
+
+ title = getString(R.string.licenses)
+
+ // Enable back button in action bar
+ supportActionBar!!.setDisplayHomeAsUpEnabled(true)
+
+ viewManager = LinearLayoutManager(this)
+ recyclerView = licenses_recycler_view
+ viewAdapter = LicenseRecyclerViewAdapter(licenses)
+ recyclerView.adapter = viewAdapter
+ recyclerView.layoutManager = viewManager
+
+ recyclerView.addOnItemTouchListener(RecyclerViewTouchListener(this, recyclerView, object : ClickListener {
+ override fun onClick(view: View, position: Int) {
+ val intent = Intent(Intent.ACTION_VIEW, viewAdapter.get(position).url)
+ startActivity(intent)
+ }
+
+ override fun onLongClick(view: View, position: Int) {}
+ }))
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem?): Boolean {
+ when (item?.itemId) {
+ android.R.id.home -> {
+ finish()
+ return true
+ }
+ }
+ return super.onOptionsItemSelected(item)
+ }
+}
diff --git a/app/src/main/java/eu/depau/etchdroid/activities/MainActivity.kt b/app/src/main/java/eu/depau/etchdroid/activities/MainActivity.kt
index e380252..6aed5ca 100644
--- a/app/src/main/java/eu/depau/etchdroid/activities/MainActivity.kt
+++ b/app/src/main/java/eu/depau/etchdroid/activities/MainActivity.kt
@@ -91,7 +91,11 @@ class MainActivity : WizardActivity() {
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
- R.id.action_settings -> true
+ R.id.action_licenses -> {
+ val intent = Intent(this, LicensesActivity::class.java)
+ startActivity(intent)
+ return true
+ }
else -> super.onOptionsItemSelected(item)
}
}
diff --git a/app/src/main/java/eu/depau/etchdroid/adapters/LicenseRecyclerViewAdapter.kt b/app/src/main/java/eu/depau/etchdroid/adapters/LicenseRecyclerViewAdapter.kt
new file mode 100644
index 0000000..31fa6be
--- /dev/null
+++ b/app/src/main/java/eu/depau/etchdroid/adapters/LicenseRecyclerViewAdapter.kt
@@ -0,0 +1,43 @@
+package eu.depau.etchdroid.adapters
+
+import android.annotation.SuppressLint
+import android.support.v7.widget.RecyclerView
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.RelativeLayout
+import eu.depau.etchdroid.R
+import eu.depau.etchdroid.utils.License
+import kotlinx.android.synthetic.main.license_row.view.*
+
+
+class LicenseRecyclerViewAdapter(private val dataset: Array) : RecyclerView.Adapter() {
+
+ class ViewHolder(val relLayout: RelativeLayout) : RecyclerView.ViewHolder(relLayout)
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
+ ViewHolder {
+
+ val relLayout = LayoutInflater.from(parent.context)
+ .inflate(R.layout.license_row, parent, false) as RelativeLayout
+ return ViewHolder(relLayout)
+ }
+
+ @SuppressLint("SetTextI18n")
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ val license = dataset[position]
+
+ holder.relLayout.software_name.text = license.name
+ holder.relLayout.software_desc.text = license.description
+ holder.relLayout.software_license.text = license.license
+ holder.relLayout.software_url.text = license.url.toString()
+
+ holder.relLayout.software_desc.visibility = if (license.description == null) View.GONE else View.VISIBLE
+ }
+
+ override fun getItemCount(): Int = dataset.size
+
+ fun get(position: Int): License {
+ return dataset[position]
+ }
+}
diff --git a/app/src/main/java/eu/depau/etchdroid/adapters/UsbDrivesRecyclerViewAdapter.kt b/app/src/main/java/eu/depau/etchdroid/adapters/UsbDrivesRecyclerViewAdapter.kt
index c567055..4dbbd92 100644
--- a/app/src/main/java/eu/depau/etchdroid/adapters/UsbDrivesRecyclerViewAdapter.kt
+++ b/app/src/main/java/eu/depau/etchdroid/adapters/UsbDrivesRecyclerViewAdapter.kt
@@ -30,11 +30,11 @@ class UsbDrivesRecyclerViewAdapter(private val dataset: Array= Build.VERSION_CODES.LOLLIPOP) {
- holder.relLayout.name.text = "${usbDevice.manufacturerName} ${usbDevice.productName}"
+ holder.relLayout.usbdev_name.text = "${usbDevice.manufacturerName} ${usbDevice.productName}"
holder.relLayout.devpath.text = usbDevice.deviceName
holder.relLayout.vidpid.text = usbDevice.vidpid
} else {
- holder.relLayout.name.text = usbDevice.deviceName
+ holder.relLayout.usbdev_name.text = usbDevice.deviceName
holder.relLayout.devpath.text = usbDevice.vidpid
}
}
diff --git a/app/src/main/java/eu/depau/etchdroid/fragments/UsbDriveFragment.kt b/app/src/main/java/eu/depau/etchdroid/fragments/UsbDriveFragment.kt
index ec21e99..a76c900 100644
--- a/app/src/main/java/eu/depau/etchdroid/fragments/UsbDriveFragment.kt
+++ b/app/src/main/java/eu/depau/etchdroid/fragments/UsbDriveFragment.kt
@@ -18,6 +18,7 @@ import eu.depau.etchdroid.adapters.UsbDrivesRecyclerViewAdapter
import eu.depau.etchdroid.kotlin_exts.name
import eu.depau.etchdroid.kotlin_exts.snackbar
import eu.depau.etchdroid.enums.WizardStep
+import eu.depau.etchdroid.utils.RecyclerViewTouchListener
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_select_usb_drive.view.*
@@ -34,37 +35,6 @@ class UsbDriveFragment : WizardFragment(), SwipeRefreshLayout.OnRefreshListener
private lateinit var refreshLayout: SwipeRefreshLayout
- class RecyclerViewTouchListener(context: Context, val recyclerView: RecyclerView, val clickListener: ClickListener) : RecyclerView.OnItemTouchListener {
- private var gestureDetector: GestureDetector
-
- init {
- gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
- override fun onSingleTapUp(e: MotionEvent): Boolean {
- return true
- }
-
- override fun onLongPress(e: MotionEvent) {
- val child = recyclerView.findChildViewUnder(e.x, e.y)
- if (child != null)
- clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child))
- }
- })
- }
-
- override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
-
- override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
- val child = rv.findChildViewUnder(e.x, e.y)
- if (child != null && gestureDetector.onTouchEvent(e)) {
- clickListener.onClick(child, rv.getChildAdapterPosition(child))
- }
- return false
- }
-
- override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
- }
-
-
override fun onRefresh() {
loadUsbDevices()
}
diff --git a/app/src/main/java/eu/depau/etchdroid/utils/License.kt b/app/src/main/java/eu/depau/etchdroid/utils/License.kt
new file mode 100644
index 0000000..bfe3048
--- /dev/null
+++ b/app/src/main/java/eu/depau/etchdroid/utils/License.kt
@@ -0,0 +1,10 @@
+package eu.depau.etchdroid.utils
+
+import android.net.Uri
+
+data class License(
+ val name: String,
+ val url: Uri,
+ val license: String,
+ val description: String? = null
+)
\ No newline at end of file
diff --git a/app/src/main/java/eu/depau/etchdroid/utils/RecyclerViewTouchListener.kt b/app/src/main/java/eu/depau/etchdroid/utils/RecyclerViewTouchListener.kt
new file mode 100644
index 0000000..368b8cd
--- /dev/null
+++ b/app/src/main/java/eu/depau/etchdroid/utils/RecyclerViewTouchListener.kt
@@ -0,0 +1,36 @@
+package eu.depau.etchdroid.utils
+
+import android.content.Context
+import android.support.v7.widget.RecyclerView
+import android.view.GestureDetector
+import android.view.MotionEvent
+
+class RecyclerViewTouchListener(context: Context, val recyclerView: RecyclerView, val clickListener: ClickListener) : RecyclerView.OnItemTouchListener {
+ private var gestureDetector: GestureDetector
+
+ init {
+ gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
+ override fun onSingleTapUp(e: MotionEvent): Boolean {
+ return true
+ }
+
+ override fun onLongPress(e: MotionEvent) {
+ val child = recyclerView.findChildViewUnder(e.x, e.y)
+ if (child != null)
+ clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child))
+ }
+ })
+ }
+
+ override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
+
+ override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
+ val child = rv.findChildViewUnder(e.x, e.y)
+ if (child != null && gestureDetector.onTouchEvent(e)) {
+ clickListener.onClick(child, rv.getChildAdapterPosition(child))
+ }
+ return false
+ }
+
+ override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_licenses.xml b/app/src/main/res/layout/activity_licenses.xml
new file mode 100644
index 0000000..be3e695
--- /dev/null
+++ b/app/src/main/res/layout/activity_licenses.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/license_row.xml b/app/src/main/res/layout/license_row.xml
new file mode 100644
index 0000000..7f886a9
--- /dev/null
+++ b/app/src/main/res/layout/license_row.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/usb_device_row.xml b/app/src/main/res/layout/usb_device_row.xml
index d787398..53bc20c 100644
--- a/app/src/main/res/layout/usb_device_row.xml
+++ b/app/src/main/res/layout/usb_device_row.xml
@@ -12,7 +12,7 @@
android:paddingTop="@dimen/row_padding">
+ android:layout_below="@id/usbdev_name"/>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0616ce9..ea0f9b6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -72,4 +72,13 @@
Type
Size
Image size checks can\'t be performed on DMG images. Make sure the USB drive is large enough before flashing.
+ GNU GPLv3
+ This app
+ Apache 2.0
+ Userspace USB block device implementation
+ GNU GPLv2
+ Custom BSD-like
+ Custom
+ Licenses
+ Converts compressed AppleĀ® DMG images