added export to clipboard in terminal
This commit is contained in:
parent
55b59d75b1
commit
ee6eef64d4
6 changed files with 88 additions and 31 deletions
5
app/proguard-rules.pro
vendored
5
app/proguard-rules.pro
vendored
|
|
@ -56,4 +56,7 @@
|
|||
#-keepnames class <1>$$serializer { # -keepnames suffices; class is kept when serializer() is kept.
|
||||
# static <1>$$serializer INSTANCE;
|
||||
#}
|
||||
-keepclassmembers enum * { *; }
|
||||
-keepclassmembers enum * { *; }
|
||||
-keepclassmembers class * extends androidx.work.Worker {
|
||||
public <init>(android.content.Context,androidx.work.WorkerParameters);
|
||||
}
|
||||
|
|
@ -1,7 +1,12 @@
|
|||
package com.deniscerri.ytdlnis.database.models
|
||||
|
||||
import com.google.gson.annotations.SerializedName
|
||||
|
||||
data class ChapterItem(
|
||||
@SerializedName(value = "start_time")
|
||||
var start_time: Long,
|
||||
@SerializedName(value = "end_time")
|
||||
var end_time: Long,
|
||||
@SerializedName(value = "title")
|
||||
var title: String,
|
||||
)
|
||||
|
|
@ -1,19 +1,20 @@
|
|||
package com.deniscerri.ytdlnis.ui.more
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.ClipboardManager
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.SharedPreferences
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.os.FileObserver
|
||||
import android.util.Log
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.view.Window
|
||||
import android.view.inputmethod.InputMethodManager
|
||||
import android.widget.EditText
|
||||
import android.widget.LinearLayout
|
||||
import android.widget.ScrollView
|
||||
import android.widget.TextView
|
||||
import android.widget.*
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import androidx.lifecycle.ViewModelProvider
|
||||
|
|
@ -33,6 +34,7 @@ import com.yausername.youtubedl_android.YoutubeDL
|
|||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
import kotlin.properties.Delegates
|
||||
|
||||
|
||||
|
|
@ -47,6 +49,8 @@ class TerminalActivity : AppCompatActivity() {
|
|||
private lateinit var commandTemplateViewModel: CommandTemplateViewModel
|
||||
private lateinit var sharedPreferences: SharedPreferences
|
||||
private var downloadID by Delegates.notNull<Int>()
|
||||
private lateinit var downloadFile : File
|
||||
private lateinit var observer: FileObserver
|
||||
var context: Context? = null
|
||||
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
|
|
@ -54,6 +58,8 @@ class TerminalActivity : AppCompatActivity() {
|
|||
setContentView(R.layout.activity_terminal)
|
||||
|
||||
downloadID = System.currentTimeMillis().toInt() % 100000
|
||||
downloadFile = File(cacheDir.absolutePath + "/$downloadID.txt")
|
||||
if (! downloadFile.exists()) downloadFile.createNewFile()
|
||||
|
||||
context = baseContext
|
||||
scrollView = findViewById(R.id.custom_command_scrollview)
|
||||
|
|
@ -84,6 +90,7 @@ class TerminalActivity : AppCompatActivity() {
|
|||
input!!.visibility = View.GONE
|
||||
output!!.text = "${output!!.text}\n~ $ ${input!!.text}\n"
|
||||
showCancelFab()
|
||||
downloadFile.appendText("~ $ ${input!!.text}\n")
|
||||
startDownload(
|
||||
input!!.text.toString()
|
||||
)
|
||||
|
|
@ -96,6 +103,36 @@ class TerminalActivity : AppCompatActivity() {
|
|||
notificationUtil = NotificationUtil(this)
|
||||
handleIntent(intent)
|
||||
|
||||
if(Build.VERSION.SDK_INT < 29){
|
||||
observer = object : FileObserver(downloadFile.absolutePath, MODIFY) {
|
||||
override fun onEvent(event: Int, p: String?) {
|
||||
runOnUiThread{
|
||||
try {
|
||||
val newText = downloadFile.readText()
|
||||
output!!.text = newText
|
||||
output!!.scrollTo(0, output!!.height)
|
||||
scrollView!!.fullScroll(View.FOCUS_DOWN)
|
||||
}catch (ignored: Exception) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
observer.startWatching()
|
||||
}else{
|
||||
observer = object : FileObserver(downloadFile, MODIFY) {
|
||||
override fun onEvent(event: Int, p: String?) {
|
||||
runOnUiThread{
|
||||
try {
|
||||
val newText = downloadFile.readText()
|
||||
output!!.text = newText
|
||||
output!!.scrollTo(0, output!!.height)
|
||||
scrollView!!.fullScroll(View.FOCUS_DOWN)
|
||||
}catch (ignored: Exception) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
observer.startWatching()
|
||||
}
|
||||
|
||||
WorkManager.getInstance(this)
|
||||
.getWorkInfosForUniqueWorkLiveData(downloadID.toString())
|
||||
.observe(this){ list ->
|
||||
|
|
@ -106,16 +143,27 @@ class TerminalActivity : AppCompatActivity() {
|
|||
input!!.requestFocus()
|
||||
hideCancelFab()
|
||||
}
|
||||
val line = work.progress.getString("output") ?: (work.outputData.getString("output") ?: return@observe)
|
||||
runOnUiThread {
|
||||
try {
|
||||
output!!.text = "${output!!.text}\n$line"
|
||||
output!!.scrollTo(0, output!!.height)
|
||||
scrollView!!.fullScroll(View.FOCUS_DOWN)
|
||||
}catch (ignored: Exception) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
initMenu()
|
||||
}
|
||||
|
||||
private fun initMenu() {
|
||||
topAppBar?.setOnMenuItemClickListener { m: MenuItem ->
|
||||
val itemId = m.itemId
|
||||
if (itemId == R.id.export_clipboard) {
|
||||
lifecycleScope.launch(Dispatchers.IO){
|
||||
val clipboard: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
|
||||
clipboard.setText(output?.text)
|
||||
}
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
downloadFile.delete()
|
||||
super.onDestroy()
|
||||
}
|
||||
|
||||
override fun onNewIntent(intent: Intent) {
|
||||
|
|
|
|||
|
|
@ -49,6 +49,9 @@ class TerminalDownloadWorker(
|
|||
tempFileDir.delete()
|
||||
tempFileDir.mkdirs()
|
||||
|
||||
val outputFile = File(context.cacheDir.absolutePath + "/$itemId.txt")
|
||||
if (! outputFile.exists()) outputFile.createNewFile()
|
||||
|
||||
request.addOption(
|
||||
"--config-locations",
|
||||
File(context.cacheDir.absolutePath + "/downloads/config${System.currentTimeMillis()}.txt").apply {
|
||||
|
|
@ -77,7 +80,7 @@ class TerminalDownloadWorker(
|
|||
}
|
||||
|
||||
YoutubeDL.getInstance().execute(request, itemId.toString()){ progress, _, line ->
|
||||
setProgressAsync(workDataOf("progress" to progress.toInt(), "output" to line, "id" to itemId, "log" to logDownloads))
|
||||
outputFile.appendText("${line}\n")
|
||||
val title: String = command.take(20)
|
||||
notificationUtil.updateDownloadNotification(
|
||||
itemId,
|
||||
|
|
@ -103,20 +106,15 @@ class TerminalDownloadWorker(
|
|||
}, 1000)
|
||||
}
|
||||
|
||||
val chunks = it.out.chunked(5000)
|
||||
val dataBuilder = Data.Builder();
|
||||
dataBuilder.putString("output", chunks[0])
|
||||
|
||||
|
||||
return Result.success(
|
||||
dataBuilder.build()
|
||||
)
|
||||
|
||||
outputFile.appendText("${it.out}\n")
|
||||
if (logDownloads && logFile.exists()){
|
||||
logFile.appendText("${it.out}\n")
|
||||
}
|
||||
}.onFailure {
|
||||
if (it is YoutubeDL.CanceledException) {
|
||||
return Result.failure()
|
||||
}
|
||||
|
||||
outputFile.appendText("${it.message}\n")
|
||||
if (logDownloads && logFile.exists()){
|
||||
logFile.appendText("${it.message}\n")
|
||||
}
|
||||
|
|
@ -129,13 +127,7 @@ class TerminalDownloadWorker(
|
|||
NotificationUtil.DOWNLOAD_SERVICE_CHANNEL_ID
|
||||
)
|
||||
|
||||
if (logDownloads && logFile.exists()){
|
||||
logFile.appendText("${it.message}\n")
|
||||
}
|
||||
|
||||
return Result.failure(
|
||||
Data.Builder().putString("output", it.message.toString()).build()
|
||||
)
|
||||
return Result.failure()
|
||||
}
|
||||
|
||||
return Result.success()
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@
|
|||
android:id="@+id/custom_command_toolbar"
|
||||
android:elevation="0dp"
|
||||
app:title="@string/terminal"
|
||||
app:menu="@menu/terminal_top_menu"
|
||||
android:layout_width="match_parent"
|
||||
app:navigationIcon="@drawable/ic_back"
|
||||
android:layout_height="match_parent"/>
|
||||
|
|
|
|||
8
app/src/main/res/menu/terminal_top_menu.xml
Normal file
8
app/src/main/res/menu/terminal_top_menu.xml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item
|
||||
android:id="@+id/export_clipboard"
|
||||
android:title="@string/export_from_clipboard"
|
||||
app:showAsAction="never" />
|
||||
</menu>
|
||||
Loading…
Reference in a new issue