diff --git a/app/src/main/java/org/yausername/dvd/ui/DownloadPathDialogFragment.kt b/app/src/main/java/org/yausername/dvd/ui/DownloadPathDialogFragment.kt index e352b19..8821753 100644 --- a/app/src/main/java/org/yausername/dvd/ui/DownloadPathDialogFragment.kt +++ b/app/src/main/java/org/yausername/dvd/ui/DownloadPathDialogFragment.kt @@ -5,27 +5,51 @@ import android.content.Context import android.net.Uri import android.os.Bundle import android.provider.DocumentsContract +import android.text.Editable +import android.text.TextWatcher +import android.widget.EditText +import android.widget.TextView import androidx.appcompat.app.AlertDialog import androidx.fragment.app.DialogFragment import androidx.preference.PreferenceManager import org.yausername.dvd.R import kotlinx.android.synthetic.main.dialog_fragment_download_path.view.* +import org.yausername.dvd.model.VidInfoItem -class DownloadPathDialogFragment : DialogFragment() { +class DownloadPathDialogFragment(val vidFormat: VidInfoItem.VidFormatItem?) : DialogFragment(), TextWatcher { private lateinit var listener: DialogListener + //It needs to be done this way because the EditText can't be read when the View is destroyed + //so instead, we make a separate String and just update it along with the EditText. + public var convertFormat: String = "" + interface DialogListener { fun onOk(dialog: DownloadPathDialogFragment) fun onFilePicker(dialog: DownloadPathDialogFragment) } + override fun afterTextChanged(s: Editable?) { + } + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + convertFormat = s.toString(); + } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { return activity?.let { val builder = AlertDialog.Builder(it) val inflater = requireActivity().layoutInflater val view = inflater.inflate(R.layout.dialog_fragment_download_path, null) + view.download_format_name.addTextChangedListener(this) + + //remove the conversion field if not downloading *only* audio + if (vidFormat == null || !(vidFormat.vidFormat.acodec != "none" && vidFormat.vidFormat.vcodec == "none")) { + view.download_format_convs.removeAllViews() + } + val sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context) val location = sharedPrefs.getString(getString(R.string.download_location_key), null) if (location != null) { @@ -37,7 +61,7 @@ class DownloadPathDialogFragment : DialogFragment() { } builder.setView(view) .setIcon(R.drawable.ic_folder_24dp) - .setTitle(R.string.download_location_title) + .setTitle(R.string.download_options_title) .setNegativeButton(R.string.action_choose_folder) { dialog, id -> listener.onFilePicker(this) @@ -53,6 +77,7 @@ class DownloadPathDialogFragment : DialogFragment() { override fun onAttach(context: Context) { super.onAttach(context) + convertFormat = "" try { listener = parentFragment as DialogListener } catch (e: ClassCastException) { diff --git a/app/src/main/java/org/yausername/dvd/ui/HomeFragment.kt b/app/src/main/java/org/yausername/dvd/ui/HomeFragment.kt index cbc4578..36da216 100644 --- a/app/src/main/java/org/yausername/dvd/ui/HomeFragment.kt +++ b/app/src/main/java/org/yausername/dvd/ui/HomeFragment.kt @@ -37,6 +37,7 @@ import org.yausername.dvd.work.DownloadWorker.Companion.urlKey import org.yausername.dvd.work.DownloadWorker.Companion.vcodecKey import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.fragment_home.view.* +import org.yausername.dvd.work.DownloadWorker.Companion.convertFormatKey import org.yausername.dvd.work.DownloadWorker.Companion.taskIdKey @@ -58,6 +59,7 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, initViews(view) } + var lastAttemptedVidFormat: VidInfoItem.VidFormatItem? = null private fun initViews(view: View) { val vidFormatsVm = ViewModelProvider(activity as MainActivity).get(VidInfoViewModel::class.java) @@ -66,9 +68,10 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, VidInfoAdapter(VidInfoListener listener@{ vidFormatsVm.selectedItem = it if (!isStoragePermissionGranted()) { + lastAttemptedVidFormat = vidFormatsVm.selectedItem return@listener } - DownloadPathDialogFragment().show( + DownloadPathDialogFragment(vidFormatsVm.selectedItem).show( childFragmentManager, downloadLocationDialogTag ) @@ -141,7 +144,7 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, setDefaultDownloadLocation(it.toString()) val vidFormatsVm = ViewModelProvider(activity as MainActivity).get(VidInfoViewModel::class.java) - startDownload(vidFormatsVm.selectedItem, it.toString()) + startDownload(vidFormatsVm.selectedItem, it.toString(), "") } } } @@ -155,7 +158,7 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, .putString(getString(R.string.download_location_key), path).apply() } - private fun startDownload(vidFormatItem: VidInfoItem.VidFormatItem, downloadDir: String) { + private fun startDownload(vidFormatItem: VidInfoItem.VidFormatItem, downloadDir: String, convFormat: String?) { val vidInfo = vidFormatItem.vidInfo val vidFormat = vidFormatItem.vidFormat val workTag = vidInfo.id @@ -179,7 +182,8 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, vcodecKey to vidFormat.vcodec, downloadDirKey to downloadDir, sizeKey to vidFormat.fileSize, - taskIdKey to vidInfo.id + taskIdKey to vidInfo.id, + convertFormatKey to convFormat ) val workRequest = OneTimeWorkRequestBuilder() .addTag(workTag) @@ -207,7 +211,7 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, Toast.makeText(context, R.string.invalid_download_location, Toast.LENGTH_SHORT).show() return } - startDownload(vidFormatsVm.selectedItem, path) + startDownload(vidFormatsVm.selectedItem, path, dialog.convertFormat) } override fun onFilePicker(dialog: DownloadPathDialogFragment) { @@ -246,7 +250,7 @@ class HomeFragment : Fragment(), SearchView.OnQueryTextListener, ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 1 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - DownloadPathDialogFragment().show( + DownloadPathDialogFragment(lastAttemptedVidFormat).show( childFragmentManager, downloadLocationDialogTag ) diff --git a/app/src/main/java/org/yausername/dvd/work/DownloadWorker.kt b/app/src/main/java/org/yausername/dvd/work/DownloadWorker.kt index 250b71d..ad89427 100644 --- a/app/src/main/java/org/yausername/dvd/work/DownloadWorker.kt +++ b/app/src/main/java/org/yausername/dvd/work/DownloadWorker.kt @@ -8,7 +8,6 @@ import android.content.Intent import android.net.Uri import android.os.Build import android.provider.DocumentsContract -import android.util.Log import android.webkit.MimeTypeMap import androidx.core.app.NotificationCompat import androidx.work.CoroutineWorker @@ -44,6 +43,7 @@ class DownloadWorker(appContext: Context, params: WorkerParameters) : val downloadDir = inputData.getString(downloadDirKey)!! val size = inputData.getLong(sizeKey, 0L) val taskId = inputData.getString(taskIdKey)!! + val convFormat = inputData.getString(convertFormatKey)!!; createNotificationChannel() val notificationId = id.hashCode() @@ -64,13 +64,19 @@ class DownloadWorker(appContext: Context, params: WorkerParameters) : tmpFile.delete() tmpFile.mkdir() tmpFile.deleteOnExit() - request.addOption("-o", "${tmpFile.absolutePath}/${name}.%(ext)s") val videoOnly = vcodec != "none" && acodec == "none" if (videoOnly) { request.addOption("-f", "${formatId}+bestaudio") } else { request.addOption("-f", formatId) } + if (convFormat != ""){ + if (vcodec == "none"){ + request.addOption("-x"); + request.addOption("--audio-format", convFormat); + } + } + request.addOption("-o", "${tmpFile.absolutePath}/${name}.%(ext)s") var destUri: Uri? = null try { @@ -179,6 +185,7 @@ class DownloadWorker(appContext: Context, params: WorkerParameters) : const val downloadDirKey = "downloadDir" const val sizeKey = "size" const val taskIdKey = "taskId" + const val convertFormatKey = "convFormat" } } diff --git a/app/src/main/res/layout/dialog_fragment_download_path.xml b/app/src/main/res/layout/dialog_fragment_download_path.xml index afaf84e..eea0c87 100644 --- a/app/src/main/res/layout/dialog_fragment_download_path.xml +++ b/app/src/main/res/layout/dialog_fragment_download_path.xml @@ -3,11 +3,44 @@ android:layout_width="wrap_content" android:layout_height="wrap_content"> - + android:orientation="vertical"> + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bef3db6..c240a61 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,7 +15,10 @@ Initialization failed No app found on device for opening this content The selected file does not exist anymore - Download location + Download options + Download location + Convert to… (optional) + (mp3, wav, etc.) Choose folder A download is already running Download queued. Check notification for progress diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index c930d30..b59949b 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -9,7 +9,7 @@