mirror of
https://github.com/MenosGrante/Rekado
synced 2025-10-05 23:22:39 +02:00
- Updated: Rekado now uses Storage Access Framework to select payloads from storage.
- Updated: Hekate to 5.0.0.
This commit is contained in:
@@ -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"
|
||||||
|
@@ -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.
@@ -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()
|
||||||
|
|
||||||
|
@@ -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)
|
||||||
|
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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()
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
@@ -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("/")
|
||||||
|
}
|
@@ -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>
|
||||||
|
@@ -1 +1 @@
|
|||||||
include ':app', ':konae'
|
include ':app'
|
||||||
|
Reference in New Issue
Block a user