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