EtchDroid/app/src/main/java/eu/depau/ddroid/fragments/ImageLocationFragment.kt

196 lines
6.7 KiB
Kotlin
Raw Normal View History

2018-08-12 14:33:11 +00:00
package eu.depau.ddroid.fragments
import android.Manifest
import android.app.Activity
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.support.design.widget.Snackbar
import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
2018-08-12 14:37:27 +00:00
import eu.depau.ddroid.R
import eu.depau.ddroid.StateKeeper
2018-08-12 14:33:11 +00:00
import eu.depau.ddroid.abc.WizardActivity
import eu.depau.ddroid.abc.WizardFragment
2018-08-13 23:32:02 +00:00
import eu.depau.ddroid.utils.getFileName
import eu.depau.ddroid.utils.snackbar
2018-08-12 14:33:11 +00:00
import eu.depau.ddroid.values.FlashMethod
import eu.depau.ddroid.values.ImageLocation
import eu.depau.ddroid.values.WizardStep
2018-08-13 23:32:02 +00:00
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.fragment_select_location.*
import kotlinx.android.synthetic.main.wizard_fragment_layout.*
2018-08-12 14:33:11 +00:00
/**
* A placeholder fragment containing a simple view.
*/
class ImageLocationFragment : WizardFragment() {
val READ_REQUEST_CODE = 42
val MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 29
val TAG = "ImageLocationFragment"
fun isStreamingAvailable(): Boolean {
if (StateKeeper.imageLocation != ImageLocation.REMOTE)
return false
if (StateKeeper.flashMethod != FlashMethod.FLASH_DD && StateKeeper.flashMethod != FlashMethod.FLASH_API)
return false
return true
}
fun setStreamingCheckBoxAvailability(context: WizardActivity) {
2018-08-13 23:32:02 +00:00
val checkBox = streaming_write_checkbox
2018-08-12 14:33:11 +00:00
if (checkBox == null)
return
val curEnabled = checkBox.isEnabled
var enabled = isStreamingAvailable()
if (curEnabled != enabled) {
checkBox.isEnabled = enabled
onCheckBoxClicked(checkBox)
}
}
override fun onCheckBoxClicked(view: View) {
super.onCheckBoxClicked(view)
if (view.id == R.id.streaming_write_checkbox)
StateKeeper.streamingWrite = view.isActivated && view.isEnabled
}
override fun onRadioButtonClicked(view: View) {
StateKeeper.imageLocation = when (view.id) {
R.id.download_img_radio -> ImageLocation.REMOTE
R.id.use_local_img_radio -> ImageLocation.LOCAL
else -> null
}
2018-08-13 23:32:02 +00:00
fab?.show()
pick_file_btn?.isEnabled = StateKeeper.imageLocation == ImageLocation.LOCAL
img_url_textview?.isEnabled = StateKeeper.imageLocation == ImageLocation.REMOTE
2018-08-12 14:33:11 +00:00
setStreamingCheckBoxAvailability(activity as WizardActivity)
updateFileButtonLabel(activity as WizardActivity)
}
override fun onButtonClicked(view: View) {
if (view.id == R.id.pick_file_btn) {
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
intent.addCategory(Intent.CATEGORY_OPENABLE)
intent.setType("*/*");
activity?.startActivityForResult(intent, READ_REQUEST_CODE)
}
}
2018-08-13 23:32:02 +00:00
override fun nextStep(view: View?) {
2018-08-12 14:33:11 +00:00
if (StateKeeper.imageLocation == null) {
2018-08-13 23:32:02 +00:00
view?.snackbar(getString(R.string.select_image_location))
2018-08-12 14:33:11 +00:00
return
}
if (StateKeeper.imageLocation == ImageLocation.REMOTE) {
try {
StateKeeper.imageFile = getRemoteImageUri(activity as WizardActivity)
} catch (e: RuntimeException) {
Log.e(TAG, "Invalid URI specified", e)
2018-08-13 23:32:02 +00:00
view?.snackbar(getString(R.string.provided_url_invalid))
2018-08-12 14:33:11 +00:00
return
}
}
if (StateKeeper.imageFile == null) {
2018-08-13 23:32:02 +00:00
view?.snackbar(getString(R.string.provide_image_file))
2018-08-12 14:33:11 +00:00
return
}
if (StateKeeper.imageLocation == ImageLocation.REMOTE && !StateKeeper.streamingWrite) {
// Request permission to download file
if (ContextCompat.checkSelfPermission(activity!!, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
ActivityCompat.requestPermissions(activity!!,
arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE),
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE)
return
}
}
2018-08-13 23:32:02 +00:00
(activity as WizardActivity).goToNewFragment(UsbDriveFragment())
2018-08-12 14:33:11 +00:00
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE -> {
// If request is cancelled, the result arrays are empty.
if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
2018-08-13 23:32:02 +00:00
nextStep(fragment_layout)
2018-08-12 14:33:11 +00:00
} else {
2018-08-13 23:32:02 +00:00
Snackbar.make(fragment_layout, getString(R.string.storage_perm_required_explaination), Snackbar.LENGTH_LONG).show()
2018-08-12 14:33:11 +00:00
}
return
}
else -> {
}
}
}
override fun onFragmentAdded(activity: WizardActivity) {
super.onFragmentAdded(activity)
setStreamingCheckBoxAvailability(activity)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
StateKeeper.currentFragment = this
StateKeeper.wizardStep = WizardStep.SELECT_LOCATION
return inflater.inflate(R.layout.fragment_select_location, container, false)
}
fun getRemoteImageUri(context: WizardActivity): Uri {
2018-08-13 23:32:02 +00:00
val text = img_url_textview.text.toString()
2018-08-12 14:33:11 +00:00
return Uri.parse(text)
}
fun updateFileButtonLabel(context: WizardActivity) {
2018-08-13 23:32:02 +00:00
val button = pick_file_btn
2018-08-12 14:33:11 +00:00
val uri = StateKeeper.imageFile
2018-08-13 23:32:02 +00:00
val text = uri?.getFileName(context)
2018-08-12 14:33:11 +00:00
2018-08-13 23:32:02 +00:00
if (text != null)
button.text = text
else
button.text = getString(R.string.pick_a_file)
2018-08-12 14:33:11 +00:00
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
// The document selected by the user won't be returned in the intent.
// Instead, a URI to that document will be contained in the return intent
// provided to this method as a parameter.
// Pull that URI using resultData.getData().
var uri: Uri? = null
if (data != null) {
uri = data.getData()
Log.d(TAG, "Uri: " + uri!!.toString())
StateKeeper.imageFile = uri
updateFileButtonLabel(activity as WizardActivity)
}
}
}
}