EtchDroid/app/src/main/java/eu/depau/etchdroid/fragments/UsbDriveFragment.kt

140 lines
4.7 KiB
Kotlin

package eu.depau.etchdroid.fragments
import android.content.Context
import android.hardware.usb.UsbDevice
import android.hardware.usb.UsbManager
import android.os.Bundle
import android.support.v4.widget.SwipeRefreshLayout
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.view.*
import com.github.mjdev.libaums.UsbMassStorageDevice
import eu.depau.etchdroid.R
import eu.depau.etchdroid.StateKeeper
import eu.depau.etchdroid.utils.ClickListener
import eu.depau.etchdroid.activities.WizardActivity
import eu.depau.etchdroid.activities.MainActivity
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.*
/**
* A placeholder fragment containing a simple view.
*/
class UsbDriveFragment : WizardFragment(), SwipeRefreshLayout.OnRefreshListener {
val TAG = "UsbDriveFragment"
private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: UsbDrivesRecyclerViewAdapter
private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var refreshLayout: SwipeRefreshLayout
override fun onRefresh() {
loadUsbDevices()
}
override fun nextStep(view: View?) {
(activity as WizardActivity).goToNewFragment(ConfirmInfoFragment())
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
StateKeeper.currentFragment = this
StateKeeper.wizardStep = WizardStep.SELECT_USB_DRIVE
val view = inflater.inflate(R.layout.fragment_select_usb_drive, container, false)
refreshLayout = view.usbdevs_refresh_layout
refreshLayout.setOnRefreshListener(this)
refreshLayout.post {
refreshLayout.isRefreshing = true
loadUsbDevices()
}
viewManager = LinearLayoutManager(activity)
recyclerView = view.usbdevs_recycler_view
recyclerView.addOnItemTouchListener(RecyclerViewTouchListener(activity!!, recyclerView, object : ClickListener {
override fun onClick(view: View, position: Int) {
val device = viewAdapter.get(position)
val manager = activity!!.getSystemService(Context.USB_SERVICE) as UsbManager
manager.requestPermission(device.usbDevice, (activity as MainActivity).mUsbPermissionIntent)
}
override fun onLongClick(view: View, position: Int) {}
}))
return view
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
fun loadUsbDevices() {
try {
viewAdapter = UsbDrivesRecyclerViewAdapter(UsbMassStorageDevice.getMassStorageDevices(activity))
recyclerView.apply {
setHasFixedSize(true)
layoutManager = viewManager
adapter = viewAdapter
}
} finally {
refreshLayout.isRefreshing = false
}
}
override fun onFragmentAdded(activity: WizardActivity) {
activity.fab.hide()
}
override fun onFragmentRemoving(activity: WizardActivity) {
activity.fab.show()
}
override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.usb_devices_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// 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_refresh -> {
loadUsbDevices()
true
}
else -> super.onOptionsItemSelected(item)
}
}
fun onUsbPermissionResult(usbDevice: UsbDevice?, granted: Boolean) {
if (!granted) {
if (usbDevice != null) {
recyclerView.snackbar(getString(R.string.usb_perm_denied) + usbDevice.name)
} else {
recyclerView.snackbar(getString(R.string.usb_perm_denied_noname))
}
return
}
StateKeeper.usbDevice = usbDevice
StateKeeper.usbMassStorageDevice = UsbMassStorageDevice.getMassStorageDevices(activity).find { it.usbDevice == usbDevice }
nextStep(null)
}
}