diff --git a/app/build.gradle b/app/build.gradle index 8c3f3c8..d8501cf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,7 +53,6 @@ android { dependencies { // Own - implementation project(":konae") implementation(name: 'siga', ext: 'aar') implementation "com.google.android.material:material:$materialComponentsVersion" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f47dc4e..eb8550a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,7 +5,6 @@ - , grantResults: IntArray) + fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) fun onResume() diff --git a/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsFragment.kt b/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsFragment.kt index 6c9605f..64d7c82 100644 --- a/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsFragment.kt +++ b/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsFragment.kt @@ -1,5 +1,6 @@ package com.pavelrekun.rekado.screens.payload_fragment +import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -30,8 +31,8 @@ class PayloadsFragment : Fragment() { mvpView.initViews() } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - mvpView.onRequestPermissionsResult(requestCode, permissions, grantResults) + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + mvpView.onActivityResult(requestCode, resultCode, data) } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsView.kt b/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsView.kt index ad9f4ea..b4272ee 100644 --- a/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsView.kt +++ b/app/src/main/java/com/pavelrekun/rekado/screens/payload_fragment/PayloadsView.kt @@ -1,29 +1,26 @@ package com.pavelrekun.rekado.screens.payload_fragment -import android.Manifest -import android.content.pm.PackageManager +import android.app.Activity +import android.content.Intent import android.widget.Toast import androidx.fragment.app.Fragment import androidx.recyclerview.widget.LinearLayoutManager -import com.pavelrekun.konae.Konae -import com.pavelrekun.konae.filters.ExtensionFileFilter import com.pavelrekun.rekado.R import com.pavelrekun.rekado.base.BaseActivity -import com.pavelrekun.rekado.data.Payload import com.pavelrekun.rekado.screens.payload_fragment.adapters.PayloadsAdapter +import com.pavelrekun.rekado.services.Constants +import com.pavelrekun.rekado.services.Constants.KEY_OPEN_PAYLOAD import com.pavelrekun.rekado.services.Events import com.pavelrekun.rekado.services.Logger import com.pavelrekun.rekado.services.dialogs.Dialogs +import com.pavelrekun.rekado.services.extensions.extractName +import com.pavelrekun.rekado.services.extensions.toFile import com.pavelrekun.rekado.services.payloads.PayloadHelper import com.pavelrekun.rekado.services.utils.MemoryUtils -import com.pavelrekun.rekado.services.utils.PermissionsUtils import com.pavelrekun.rekado.services.utils.SettingsUtils import com.pavelrekun.siga.services.extensions.tintIconReverse import kotlinx.android.synthetic.main.fragment_payloads.* import org.greenrobot.eventbus.EventBus -import java.io.File -import java.io.IOException - class PayloadsView(private val activity: BaseActivity, private val fragment: Fragment) : PayloadsContract.View { @@ -32,19 +29,11 @@ class PayloadsView(private val activity: BaseActivity, private val fragment: Fra override fun initViews() { activity.setTitle(R.string.navigation_payloads) - prepareList() + initList() initClickListeners() initDesign() } - override fun prepareList() { - if (!PermissionsUtils.checkPermissionGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - PermissionsUtils.showPermissionDialog(activity, fragment, PermissionsUtils.PERMISSIONS_GET_PAYLOADS) - } else { - initList() - } - } - override fun initList() { if (!SettingsUtils.checkHideBundledEnabled()) { MemoryUtils.copyBundledPayloads() @@ -74,55 +63,43 @@ class PayloadsView(private val activity: BaseActivity, private val fragment: Fra } override fun addPayload() { - if (!PermissionsUtils.checkPermissionGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - PermissionsUtils.showPermissionDialog(activity, fragment, PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE) - } else { - getPayloadFromStorage() - } + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT) + intent.addCategory(Intent.CATEGORY_OPENABLE) + intent.type = Constants.MIME_BINARY + intent.putExtra(Intent.EXTRA_TITLE, R.string.dialog_file_chooser_payload_title) + fragment.startActivityForResult(intent, KEY_OPEN_PAYLOAD) } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - when (requestCode) { - PermissionsUtils.PERMISSIONS_GET_PAYLOADS -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - initList() + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + if (requestCode == KEY_OPEN_PAYLOAD) { + when (resultCode) { + Activity.RESULT_OK -> data?.data?.let { + val path = it.path + if (path != null) { + val name = path.extractName() + val inputStream = activity.contentResolver.openInputStream(it) + + if (inputStream != null) { + inputStream.toFile("${PayloadHelper.getLocation().absolutePath}/$name") + EventBus.getDefault().post(Events.UpdatePayloadsListEvent()) + Logger.info("Added new payload: $name") + } else { + Toast.makeText(activity, activity.getString(R.string.helper_error_adding_payload), Toast.LENGTH_SHORT).show() + Logger.error("Failed to add payload: $name") + } + activity.contentResolver.openInputStream(it)?.toFile(PayloadHelper.getLocation().absolutePath + "/" + it.path?.extractName()) + } else { + Toast.makeText(activity, activity.getString(R.string.helper_error_adding_payload), Toast.LENGTH_SHORT).show() + Logger.error("Failed to add selected payload!") + } + } } - PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - getPayloadFromStorage() - } else { - Toast.makeText(activity, R.string.permission_storage_error, Toast.LENGTH_SHORT).show() - } - } - } - - private fun getPayloadFromStorage() { - Konae().with(activity).withChosenListener(object : Konae.Result { - override fun onChoosePath(dirFile: File) { - onChosenFileListener(dirFile) - } - }).withFileFilter(ExtensionFileFilter("bin")).onlyDirectory(false).withTitle(activity.getString(R.string.dialog_file_chooser_payload_title)).build().show() - } - - private fun onChosenFileListener(pathFile: File) { - val payload = Payload(pathFile.name, PayloadHelper.getPath(pathFile.name)) - - if (!payload.name.contains("bin")) { - Toast.makeText(activity, activity.getString(R.string.helper_error_file_payload_wrong), Toast.LENGTH_SHORT).show() - } - - try { - MemoryUtils.toFile(pathFile, "${PayloadHelper.getLocation()}/${payload.name}") - - EventBus.getDefault().post(Events.UpdatePayloadsListEvent()) - Logger.info("Added new payload: ${payload.name}") - } catch (e: IOException) { - e.printStackTrace() - Logger.error("Failed to add payload: ${payload.name}") } } override fun onResume() { if (this::adapter.isInitialized) { - prepareList() + initList() } } } \ No newline at end of file diff --git a/app/src/main/java/com/pavelrekun/rekado/screens/settings_activity/SettingsFragment.kt b/app/src/main/java/com/pavelrekun/rekado/screens/settings_activity/SettingsFragment.kt index d84f53b..0575293 100644 --- a/app/src/main/java/com/pavelrekun/rekado/screens/settings_activity/SettingsFragment.kt +++ b/app/src/main/java/com/pavelrekun/rekado/screens/settings_activity/SettingsFragment.kt @@ -37,11 +37,7 @@ class SettingsFragment : PreferenceFragmentCompat() { addPreferencesFromResource(R.xml.preferences) - if (!PermissionsUtils.checkPermissionGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { - PermissionsUtils.showPermissionDialog(activity, this, PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE) - } else { - initPayloadsCategoryPreferences() - } + initPayloadsCategoryPreferences() } private fun initPayloadsCategoryPreferences() { @@ -121,16 +117,6 @@ class SettingsFragment : PreferenceFragmentCompat() { } } - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { - when (requestCode) { - PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - initPayloadsCategoryPreferences() - } else { - Toast.makeText(activity, R.string.permission_storage_error, Toast.LENGTH_SHORT).show() - } - } - } - private fun openSettingsFragment(fragment: Fragment) { activity.supportFragmentManager?.beginTransaction()?.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)?.replace(R.id.settingsFragmentFrame, fragment, fragment::class.java.simpleName)?.addToBackStack(null)?.commit() } diff --git a/app/src/main/java/com/pavelrekun/rekado/services/Constants.kt b/app/src/main/java/com/pavelrekun/rekado/services/Constants.kt index d0c1a81..bb2620c 100644 --- a/app/src/main/java/com/pavelrekun/rekado/services/Constants.kt +++ b/app/src/main/java/com/pavelrekun/rekado/services/Constants.kt @@ -12,4 +12,8 @@ object Constants { const val TWITTER_LINK = "https://twitter.com/menosgrante" const val DONATE_LINK = "https://www.buymeacoffee.com/pavelrekun" const val PRODUCT_HUNT_LINK = "https://producthunt.com/@menosgrante/made" + + const val MIME_BINARY = "application/octet-stream" + + const val KEY_OPEN_PAYLOAD = 123 } \ No newline at end of file diff --git a/app/src/main/java/com/pavelrekun/rekado/services/extensions/GenericExtensions.kt b/app/src/main/java/com/pavelrekun/rekado/services/extensions/GenericExtensions.kt index 96e0f84..58bc19a 100644 --- a/app/src/main/java/com/pavelrekun/rekado/services/extensions/GenericExtensions.kt +++ b/app/src/main/java/com/pavelrekun/rekado/services/extensions/GenericExtensions.kt @@ -1,6 +1,8 @@ package com.pavelrekun.rekado.services.extensions import android.widget.EditText +import java.io.File +import java.io.InputStream fun EditText.getString(upperCase: Boolean = false): String { return if (upperCase) { @@ -12,4 +14,10 @@ fun EditText.getString(upperCase: Boolean = false): String { fun EditText.isEmpty() = this.text.isEmpty() -fun EditText.length() = this.textSize.toString().length \ No newline at end of file +fun InputStream.toFile(path: String) { + File(path).outputStream().use { this.copyTo(it) } +} + +fun String.extractName(): String { + return this.substringAfterLast("/") +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dfed62c..d1b2b33 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -114,4 +114,5 @@ Are you sure this is correct payload file? + Selected payload can not be added! diff --git a/settings.gradle b/settings.gradle index 32adb04..e7b4def 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':konae' +include ':app'