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) } }