- Updated: Rekado now uses Storage Access Framework to select payloads from storage.

- Updated: Hekate to 5.0.0.
This commit is contained in:
Pavel Rekun
2019-06-30 11:08:55 +03:00
parent 7b1cdaaee1
commit 418dab7dd5
11 changed files with 60 additions and 85 deletions

View File

@@ -53,7 +53,6 @@ android {
dependencies {
// Own
implementation project(":konae")
implementation(name: 'siga', ext: 'aar')
implementation "com.google.android.material:material:$materialComponentsVersion"

View File

@@ -5,7 +5,6 @@
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
android:name=".RekadoApplication"

Binary file not shown.

View File

@@ -1,24 +1,24 @@
package com.pavelrekun.rekado.screens.payload_fragment
import android.content.Intent
interface PayloadsContract {
interface View {
fun initViews()
fun prepareList()
fun initList()
fun initDesign()
fun updateList()
fun initClickListeners()
fun updateList()
fun addPayload()
fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray)
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
fun onResume()

View File

@@ -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<out String>, 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)

View File

@@ -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<out String>, 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()
}
}
}

View File

@@ -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<out String>, 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()
}

View File

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

View File

@@ -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
fun InputStream.toFile(path: String) {
File(path).outputStream().use { this.copyTo(it) }
}
fun String.extractName(): String {
return this.substringAfterLast("/")
}

View File

@@ -114,4 +114,5 @@
<!-- Strings for Helper -->
<string name="helper_error_file_payload_wrong">Are you sure this is correct payload file?</string>
<string name="helper_error_adding_payload">Selected payload can not be added!</string>
</resources>

View File

@@ -1 +1 @@
include ':app', ':konae'
include ':app'