- 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 { dependencies {
// Own // Own
implementation project(":konae")
implementation(name: 'siga', ext: 'aar') implementation(name: 'siga', ext: 'aar')
implementation "com.google.android.material:material:$materialComponentsVersion" 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.INTERNET" />
<uses-permission android:name="android.permission.REORDER_TASKS" /> <uses-permission android:name="android.permission.REORDER_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application <application
android:name=".RekadoApplication" android:name=".RekadoApplication"

Binary file not shown.

View File

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

View File

@@ -1,5 +1,6 @@
package com.pavelrekun.rekado.screens.payload_fragment package com.pavelrekun.rekado.screens.payload_fragment
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
@@ -30,8 +31,8 @@ class PayloadsFragment : Fragment() {
mvpView.initViews() mvpView.initViews()
} }
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
mvpView.onRequestPermissionsResult(requestCode, permissions, grantResults) mvpView.onActivityResult(requestCode, resultCode, data)
} }
@Subscribe(threadMode = ThreadMode.MAIN) @Subscribe(threadMode = ThreadMode.MAIN)

View File

@@ -1,29 +1,26 @@
package com.pavelrekun.rekado.screens.payload_fragment package com.pavelrekun.rekado.screens.payload_fragment
import android.Manifest import android.app.Activity
import android.content.pm.PackageManager import android.content.Intent
import android.widget.Toast import android.widget.Toast
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager 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.R
import com.pavelrekun.rekado.base.BaseActivity 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.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.Events
import com.pavelrekun.rekado.services.Logger import com.pavelrekun.rekado.services.Logger
import com.pavelrekun.rekado.services.dialogs.Dialogs 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.payloads.PayloadHelper
import com.pavelrekun.rekado.services.utils.MemoryUtils import com.pavelrekun.rekado.services.utils.MemoryUtils
import com.pavelrekun.rekado.services.utils.PermissionsUtils
import com.pavelrekun.rekado.services.utils.SettingsUtils import com.pavelrekun.rekado.services.utils.SettingsUtils
import com.pavelrekun.siga.services.extensions.tintIconReverse import com.pavelrekun.siga.services.extensions.tintIconReverse
import kotlinx.android.synthetic.main.fragment_payloads.* import kotlinx.android.synthetic.main.fragment_payloads.*
import org.greenrobot.eventbus.EventBus 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 { 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() { override fun initViews() {
activity.setTitle(R.string.navigation_payloads) activity.setTitle(R.string.navigation_payloads)
prepareList() initList()
initClickListeners() initClickListeners()
initDesign() 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() { override fun initList() {
if (!SettingsUtils.checkHideBundledEnabled()) { if (!SettingsUtils.checkHideBundledEnabled()) {
MemoryUtils.copyBundledPayloads() MemoryUtils.copyBundledPayloads()
@@ -74,55 +63,43 @@ class PayloadsView(private val activity: BaseActivity, private val fragment: Fra
} }
override fun addPayload() { override fun addPayload() {
if (!PermissionsUtils.checkPermissionGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
PermissionsUtils.showPermissionDialog(activity, fragment, PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE) intent.addCategory(Intent.CATEGORY_OPENABLE)
} else { intent.type = Constants.MIME_BINARY
getPayloadFromStorage() 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) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) { if (requestCode == KEY_OPEN_PAYLOAD) {
PermissionsUtils.PERMISSIONS_GET_PAYLOADS -> if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { when (resultCode) {
initList() 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() { override fun onResume() {
if (this::adapter.isInitialized) { if (this::adapter.isInitialized) {
prepareList() initList()
} }
} }
} }

View File

@@ -37,11 +37,7 @@ class SettingsFragment : PreferenceFragmentCompat() {
addPreferencesFromResource(R.xml.preferences) addPreferencesFromResource(R.xml.preferences)
if (!PermissionsUtils.checkPermissionGranted(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { initPayloadsCategoryPreferences()
PermissionsUtils.showPermissionDialog(activity, this, PermissionsUtils.PERMISSIONS_WRITE_REQUEST_CODE)
} else {
initPayloadsCategoryPreferences()
}
} }
private fun 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) { 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() 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 TWITTER_LINK = "https://twitter.com/menosgrante"
const val DONATE_LINK = "https://www.buymeacoffee.com/pavelrekun" const val DONATE_LINK = "https://www.buymeacoffee.com/pavelrekun"
const val PRODUCT_HUNT_LINK = "https://producthunt.com/@menosgrante/made" 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 package com.pavelrekun.rekado.services.extensions
import android.widget.EditText import android.widget.EditText
import java.io.File
import java.io.InputStream
fun EditText.getString(upperCase: Boolean = false): String { fun EditText.getString(upperCase: Boolean = false): String {
return if (upperCase) { return if (upperCase) {
@@ -12,4 +14,10 @@ fun EditText.getString(upperCase: Boolean = false): String {
fun EditText.isEmpty() = this.text.isEmpty() 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 --> <!-- Strings for Helper -->
<string name="helper_error_file_payload_wrong">Are you sure this is correct payload file?</string> <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> </resources>

View File

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