From f335bbddf5f06baa8ebaff1fadb5dfd20b97a492 Mon Sep 17 00:00:00 2001 From: deniscerri <64997243+deniscerri@users.noreply.github.com> Date: Sun, 29 Oct 2023 00:45:42 +0200 Subject: [PATCH] changes - added extractor args lang when searching in yt-dlp - removed webarchive search engine since its not supported anymore - fixed terminal prematurely closing - made format auto-update on by default for new users - fixed main activity getting removed from recents when using the app with rvx - added ability to have the last used command template for the next download - fixed app crashing in landscape logs - fixed app constantly going back to home in landscape or config change. now it keeps state - add subtitle language suggestions in the subtitle dialog - made command template scroll state hold even if fragment is destroyed - added slovak sk language - fixed terminal icon being blank in white mode, and now its red - fixed share files from notification showing 2 files even though its 1 - fixed history item not being deleted from the bottom sheet - cleared outdated player urls for stale result items - added export cookies as file - added export command templates for selected templates - added icons for history details sheet chips - added markdown in the update dialog --- README-az.md | 2 +- README-id.MD => README-id.md | 2 +- README-pt.md | 2 +- README-sq.md | 2 +- README.MD => README.md | 4 +- app/build.gradle | 5 +- .../11.json | 558 ++++++++++++++++++ app/src/main/AndroidManifest.xml | 11 +- .../com/deniscerri/ytdlnis/MainActivity.kt | 48 +- .../deniscerri/ytdlnis/database/Converters.kt | 5 - .../deniscerri/ytdlnis/database/DBManager.kt | 5 - .../database/dao/CommandTemplateDao.kt | 8 +- .../deniscerri/ytdlnis/database/dao/LogDao.kt | 1 - .../ytdlnis/database/dao/TerminalDao.kt | 15 +- .../database/models/DownloadItemSimple.kt | 1 - .../ytdlnis/database/models/GithubRelease.kt | 2 + .../ytdlnis/database/models/LogItem.kt | 1 - .../ytdlnis/database/models/TerminalItem.kt | 1 - .../repository/CommandTemplateRepository.kt | 4 +- .../database/repository/CookieRepository.kt | 1 - .../database/repository/LogRepository.kt | 19 +- .../database/repository/ResultRepository.kt | 1 - .../viewmodel/CommandTemplateViewModel.kt | 5 +- .../database/viewmodel/CookieViewModel.kt | 16 + .../database/viewmodel/DownloadViewModel.kt | 21 +- .../database/viewmodel/HistoryViewModel.kt | 2 +- .../database/viewmodel/LogViewModel.kt | 2 - .../database/viewmodel/ResultViewModel.kt | 3 - .../database/viewmodel/TerminalViewModel.kt | 41 -- .../ytdlnis/receiver/AlarmStopReceiver.kt | 3 - .../CancelDownloadNotificationReceiver.kt | 2 - .../ytdlnis/receiver/CancelWorkReceiver.kt | 9 - .../PauseDownloadNotificationReceiver.kt | 1 - .../ytdlnis/receiver/ShareFileActivity.kt | 7 +- .../com/deniscerri/ytdlnis/ui/HomeFragment.kt | 7 +- .../{ => ui}/adapter/ActiveDownloadAdapter.kt | 10 +- .../adapter/ActiveDownloadMinifiedAdapter.kt | 16 +- .../ConfigureMultipleDownloadsAdapter.kt | 15 +- .../ytdlnis/{ => ui}/adapter/CookieAdapter.kt | 7 +- .../{ => ui}/adapter/DownloadLogsAdapter.kt | 10 +- .../adapter/GenericDownloadAdapter.kt | 8 +- .../{ => ui}/adapter/HistoryAdapter.kt | 15 +- .../ytdlnis/{ => ui}/adapter/HomeAdapter.kt | 8 +- .../{ => ui}/adapter/PlaylistAdapter.kt | 7 +- .../{ => ui}/adapter/TemplatesAdapter.kt | 72 ++- .../adapter/TerminalDownloadsAdapter.kt | 6 +- .../ui/downloadcard/AddExtraCommandsDialog.kt | 8 - .../ConfigureDownloadBottomSheetDialog.kt | 5 +- .../downloadcard/CutVideoBottomSheetDialog.kt | 1 - .../ui/downloadcard/DownloadAudioFragment.kt | 40 +- .../downloadcard/DownloadBottomSheetDialog.kt | 79 ++- .../downloadcard/DownloadCommandFragment.kt | 31 +- .../DownloadMultipleBottomSheetDialog.kt | 31 +- .../ui/downloadcard/DownloadVideoFragment.kt | 35 +- .../FormatSelectionBottomSheetDialog.kt | 8 +- .../downloadcard/ResultCardDetailsDialog.kt | 19 +- .../downloadcard/SelectPlaylistItemsDialog.kt | 10 +- .../ui/downloads/ActiveDownloadsFragment.kt | 6 +- .../downloads/CancelledDownloadsFragment.kt | 8 +- .../ui/downloads/DownloadQueueMainFragment.kt | 2 - .../ui/downloads/ErroredDownloadsFragment.kt | 8 +- .../ytdlnis/ui/downloads/HistoryFragment.kt | 21 +- .../ui/downloads/QueuedDownloadsFragment.kt | 6 +- .../ui/downloads/SavedDownloadsFragment.kt | 8 +- .../ui/more/CommandTemplatesFragment.kt | 130 +++- .../ytdlnis/ui/more/CookiesFragment.kt | 24 +- .../ytdlnis/ui/more/MoreFragment.kt | 1 - .../more/downloadLogs/DownloadLogFragment.kt | 64 +- .../downloadLogs/DownloadLogListFragment.kt | 2 +- .../more/settings/FolderSettingsFragment.kt | 30 +- .../more/settings/GeneralSettingsFragment.kt | 22 +- .../ui/more/settings/SettingsActivity.kt | 2 +- .../ui/more/terminal/TerminalActivity.kt | 7 - .../terminal/TerminalDownloadsListFragment.kt | 13 +- .../ui/more/terminal/TerminalFragment.kt | 75 ++- .../com/deniscerri/ytdlnis/util/FileUtil.kt | 16 +- .../com/deniscerri/ytdlnis/util/InfoUtil.kt | 28 +- .../ytdlnis/util/NotificationUtil.kt | 42 +- .../com/deniscerri/ytdlnis/util/UiUtil.kt | 176 ++++-- .../com/deniscerri/ytdlnis/util/UpdateUtil.kt | 46 +- .../deniscerri/ytdlnis/work/DownloadWorker.kt | 38 +- .../ytdlnis/work/MoveCacheFilesWorker.kt | 19 - .../ytdlnis/work/TerminalDownloadWorker.kt | 15 +- .../res/drawable/terminal_icon_foreground.xml | 2 +- .../res/layout-land/result_card_details.xml | 2 +- .../configure_download_bottom_sheet.xml | 1 + .../main/res/layout/download_bottom_sheet.xml | 1 + app/src/main/res/layout/fragment_active.xml | 61 +- .../res/layout/fragment_command_templates.xml | 28 +- app/src/main/res/layout/fragment_cookies.xml | 2 +- .../res/layout/fragment_download_audio.xml | 2 - .../res/layout/fragment_download_command.xml | 2 +- .../main/res/layout/fragment_download_log.xml | 2 +- .../res/layout/fragment_download_log_list.xml | 2 +- .../fragment_download_queue_main_screen.xml | 7 +- app/src/main/res/layout/fragment_history.xml | 2 +- app/src/main/res/layout/fragment_inqueue.xml | 58 +- .../fragment_terminal_download_list.xml | 2 +- app/src/main/res/layout/generic_list.xml | 19 + .../main/res/layout/generic_recyclerview.xml | 10 - app/src/main/res/layout/history_card.xml | 22 +- .../history_item_details_bottom_sheet.xml | 2 + ...{history_no_results.xml => no_results.xml} | 0 app/src/main/res/layout/subtitle_dialog.xml | 61 ++ app/src/main/res/menu/cookies_menu.xml | 5 + app/src/main/res/menu/log_detail_menu.xml | 7 + .../main/res/menu/templates_menu_context.xml | 27 + app/src/main/res/values/arrays.xml | 91 ++- app/src/main/res/values/strings.xml | 5 +- app/src/main/res/xml/locales_config.xml | 1 + app/src/main/res/xml/updating_preferences.xml | 2 +- 111 files changed, 1811 insertions(+), 682 deletions(-) rename README-id.MD => README-id.md (99%) rename README.MD => README.md (98%) create mode 100644 app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/ActiveDownloadAdapter.kt (96%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/ActiveDownloadMinifiedAdapter.kt (93%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/ConfigureMultipleDownloadsAdapter.kt (94%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/CookieAdapter.kt (94%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/DownloadLogsAdapter.kt (95%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/GenericDownloadAdapter.kt (97%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/HistoryAdapter.kt (92%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/HomeAdapter.kt (98%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/PlaylistAdapter.kt (97%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/TemplatesAdapter.kt (57%) rename app/src/main/java/com/deniscerri/ytdlnis/{ => ui}/adapter/TerminalDownloadsAdapter.kt (96%) create mode 100644 app/src/main/res/layout/generic_list.xml delete mode 100644 app/src/main/res/layout/generic_recyclerview.xml rename app/src/main/res/layout/{history_no_results.xml => no_results.xml} (100%) create mode 100644 app/src/main/res/layout/subtitle_dialog.xml create mode 100644 app/src/main/res/menu/templates_menu_context.xml diff --git a/README-az.md b/README-az.md index 3c3ba691..79f8bd60 100644 --- a/README-az.md +++ b/README-az.md @@ -4,7 +4,7 @@
- English + English   |    Azərbaycanca
diff --git a/README-id.MD b/README-id.md similarity index 99% rename from README-id.MD rename to README-id.md index 362e6246..67ee9e1a 100644 --- a/README-id.MD +++ b/README-id.md @@ -4,7 +4,7 @@
- English + English   |    Indonesia
diff --git a/README-pt.md b/README-pt.md index 9ed9fe5c..8250ce12 100644 --- a/README-pt.md +++ b/README-pt.md @@ -4,7 +4,7 @@
- English + English   |    Português
diff --git a/README-sq.md b/README-sq.md index a680986a..7235afc7 100644 --- a/README-sq.md +++ b/README-sq.md @@ -4,7 +4,7 @@
- English + English   |    Shqip
diff --git a/README.MD b/README.md similarity index 98% rename from README.MD rename to README.md index 7e637433..a5196bb3 100644 --- a/README.MD +++ b/README.md @@ -10,7 +10,7 @@   |    Azərbaycanca   |    - Indonesia + Indonesia   |    Português @@ -34,7 +34,7 @@ [![community](https://img.shields.io/badge/Telegram-Updates-red?style=flat-square&logo=telegram)](https://t.me/ytdlnisupdates) - +### The links above are the only trusted sources of YTDLnis. Everything else is not related to me. diff --git a/app/build.gradle b/app/build.gradle index c10a2840..ec5a7518 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,7 +10,7 @@ def properties = new Properties() def versionMajor = 1 def versionMinor = 6 def versionPatch = 8 -def versionBuild = 3 // bump for dogfood builds, public betas, etc. +def versionBuild = 4 // bump for dogfood builds, public betas, etc. def versionExt = "" if (versionBuild > 0){ @@ -188,5 +188,6 @@ dependencies { implementation "com.anggrayudi:storage:1.5.5" implementation 'me.zhanghai.android.fastscroll:library:1.3.0' implementation 'com.google.accompanist:accompanist-webview:0.30.1' - implementation 'androidx.compose.material3:material3-android:1.2.0-alpha09' + implementation 'androidx.compose.material3:material3-android:1.2.0-alpha10' + implementation "io.noties.markwon:core:4.6.2" } diff --git a/app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json b/app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json new file mode 100644 index 00000000..ea52b871 --- /dev/null +++ b/app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json @@ -0,0 +1,558 @@ +{ + "formatVersion": 1, + "database": { + "version": 11, + "identityHash": "09798517d2b7ce96999c879bcd381c7f", + "entities": [ + { + "tableName": "results", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `website` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `formats` TEXT NOT NULL, `urls` TEXT NOT NULL DEFAULT '', `chapters` TEXT, `creationTime` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "thumb", + "columnName": "thumb", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "website", + "columnName": "website", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "playlistTitle", + "columnName": "playlistTitle", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "formats", + "columnName": "formats", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "urls", + "columnName": "urls", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "chapters", + "columnName": "chapters", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "creationTime", + "columnName": "creationTime", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "history", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `duration` TEXT NOT NULL, `thumb` TEXT NOT NULL, `type` TEXT NOT NULL, `time` INTEGER NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `format` TEXT NOT NULL, `downloadId` INTEGER NOT NULL DEFAULT 0, `command` TEXT NOT NULL DEFAULT '')", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "thumb", + "columnName": "thumb", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "downloadPath", + "columnName": "downloadPath", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "website", + "columnName": "website", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "format", + "columnName": "format", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadId", + "columnName": "downloadId", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "command", + "columnName": "command", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "downloads", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `thumb` TEXT NOT NULL, `duration` TEXT NOT NULL, `type` TEXT NOT NULL, `format` TEXT NOT NULL, `container` TEXT NOT NULL DEFAULT 'Default', `downloadSections` TEXT NOT NULL DEFAULT '', `allFormats` TEXT NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `downloadSize` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `audioPreferences` TEXT NOT NULL, `videoPreferences` TEXT NOT NULL, `extraCommands` TEXT NOT NULL DEFAULT '', `customFileNameTemplate` TEXT NOT NULL, `SaveThumb` INTEGER NOT NULL, `status` TEXT NOT NULL DEFAULT 'Queued', `downloadStartTime` INTEGER NOT NULL DEFAULT 0, `logID` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "thumb", + "columnName": "thumb", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "duration", + "columnName": "duration", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "format", + "columnName": "format", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "container", + "columnName": "container", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'Default'" + }, + { + "fieldPath": "downloadSections", + "columnName": "downloadSections", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "allFormats", + "columnName": "allFormats", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadPath", + "columnName": "downloadPath", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "website", + "columnName": "website", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadSize", + "columnName": "downloadSize", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "playlistTitle", + "columnName": "playlistTitle", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "audioPreferences", + "columnName": "audioPreferences", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "videoPreferences", + "columnName": "videoPreferences", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "extraCommands", + "columnName": "extraCommands", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "customFileNameTemplate", + "columnName": "customFileNameTemplate", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "SaveThumb", + "columnName": "SaveThumb", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'Queued'" + }, + { + "fieldPath": "downloadStartTime", + "columnName": "downloadStartTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "logID", + "columnName": "logID", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "commandTemplates", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `useAsExtraCommand` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "useAsExtraCommand", + "columnName": "useAsExtraCommand", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "searchHistory", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `query` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "query", + "columnName": "query", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "templateShortcuts", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "cookies", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `content` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "logs", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `title` TEXT NOT NULL, `content` TEXT NOT NULL, `format` TEXT NOT NULL, `downloadType` TEXT NOT NULL, `downloadTime` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "format", + "columnName": "format", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadType", + "columnName": "downloadType", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadTime", + "columnName": "downloadTime", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "terminalDownloads", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `command` TEXT NOT NULL, `log` TEXT DEFAULT '')", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "command", + "columnName": "command", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "log", + "columnName": "log", + "affinity": "TEXT", + "notNull": false, + "defaultValue": "''" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '09798517d2b7ce96999c879bcd381c7f')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 45d2930c..51a85cf4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -43,7 +43,7 @@ @@ -53,7 +53,6 @@ android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize" android:excludeFromRecents="true" android:exported="true" - android:launchMode="singleInstance" android:theme="@style/Theme.BottomSheet"> @@ -125,7 +124,7 @@ android:enabled="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" - android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize" + android:configChanges="locale" android:targetActivity=".MainActivity" android:windowSoftInputMode="adjustPan" android:exported="true"> @@ -147,7 +146,7 @@ android:exported="true" android:icon="@mipmap/ic_launcher_dark" android:roundIcon="@mipmap/ic_launcher_round_dark" - android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize" + android:configChanges="locale" android:targetActivity=".MainActivity" android:windowSoftInputMode="adjustPan"> @@ -167,7 +166,7 @@ android:exported="true" android:icon="@mipmap/ic_launcher_light" android:roundIcon="@mipmap/ic_launcher_round_light" - android:configChanges="smallestScreenSize|layoutDirection|locale|orientation|screenSize" + android:configChanges="locale" android:targetActivity=".MainActivity" android:windowSoftInputMode="adjustPan"> @@ -183,7 +182,7 @@ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 1eddb639..6b9b3627 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -45,11 +45,9 @@ import com.deniscerri.ytdlnis.ui.downloadcard.DownloadBottomSheetDialog import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity import com.deniscerri.ytdlnis.util.FileUtil import com.deniscerri.ytdlnis.util.ThemeUtil -import com.deniscerri.ytdlnis.util.UiUtil import com.deniscerri.ytdlnis.util.UpdateUtil import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.elevation.SurfaceColors import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationView import com.google.android.material.navigationrail.NavigationRailView @@ -65,7 +63,6 @@ import java.io.BufferedReader import java.io.File import java.io.InputStreamReader import java.io.Reader -import java.net.URI import java.nio.charset.Charset import java.nio.charset.StandardCharsets import kotlin.system.exitProcess @@ -81,7 +78,6 @@ class MainActivity : BaseActivity() { private lateinit var navigationView: View private lateinit var navHostFragment : NavHostFragment private lateinit var navController : NavController - private lateinit var sharedPreferences: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -93,9 +89,7 @@ class MainActivity : BaseActivity() { downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] preferences = PreferenceManager.getDefaultSharedPreferences(context) - if (preferences.getBoolean("incognito", false)){ - resultViewModel.deleteAll() - } + if (preferences.getBoolean("incognito", false)) resultViewModel.deleteAll() askPermissions() checkUpdate() @@ -120,17 +114,17 @@ class MainActivity : BaseActivity() { } } - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) + if (savedInstanceState == null){ + val graph = navController.navInflater.inflate(R.navigation.nav_graph) + graph.setStartDestination(R.id.homeFragment) + when(preferences.getString("start_destination", "")) { + "History" -> graph.setStartDestination(R.id.historyFragment) + "More" -> if (navigationView is NavigationBarView) graph.setStartDestination(R.id.moreFragment) + } - val graph = navController.navInflater.inflate(R.navigation.nav_graph) - graph.setStartDestination(R.id.homeFragment) - when(sharedPreferences.getString("start_destination", "")) { - "History" -> graph.setStartDestination(R.id.historyFragment) - "More" -> if (navigationView is NavigationBarView) graph.setStartDestination(R.id.moreFragment) + navController.graph = graph } - navController.graph = graph - if (navigationView is NavigationBarView){ (navigationView as NavigationBarView).setupWithNavController(navController) (navigationView as NavigationBarView).setOnItemReselectedListener { @@ -164,7 +158,7 @@ class MainActivity : BaseActivity() { (navigationView as NavigationView).setupWithNavController(navController) //terminate button (navigationView as NavigationView).menu.getItem(7).setOnMenuItemClickListener { - if (sharedPreferences.getBoolean("ask_terminate_app", true)){ + if (preferences.getBoolean("ask_terminate_app", true)){ var doNotShowAgain = false val terminateDialog = MaterialAlertDialogBuilder(this) terminateDialog.setTitle(getString(R.string.confirm_delete_history)) @@ -188,7 +182,7 @@ class MainActivity : BaseActivity() { runBlocking { job.join() if (doNotShowAgain){ - sharedPreferences.edit().putBoolean("ask_terminate_app", false).apply() + preferences.edit().putBoolean("ask_terminate_app", false).apply() } finishAndRemoveTask() finishAffinity() @@ -212,9 +206,6 @@ class MainActivity : BaseActivity() { (navigationView as NavigationView).getHeaderView(0).findViewById(R.id.title).text = ThemeUtil.getStyledAppName(this) } - cookieViewModel.updateCookiesFile() - val intent = intent - handleIntents(intent) navController.addOnDestinationChangedListener { _, destination, _ -> if (navigationView is NavigationBarView){ @@ -233,12 +224,15 @@ class MainActivity : BaseActivity() { } } - - when(sharedPreferences.getString("start_destination", "")) { - "Queue" -> navController.navigate(R.id.downloadQueueMainFragment) + when(preferences.getString("start_destination", "")) { + "Queue" -> if (savedInstanceState == null) navController.navigate(R.id.downloadQueueMainFragment) } - if (sharedPreferences.getBoolean("auto_update_ytdlp", false)){ + cookieViewModel.updateCookiesFile() + val intent = intent + handleIntents(intent) + + if (preferences.getBoolean("auto_update_ytdlp", false)){ CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) { if(DBManager.getInstance(this@MainActivity).downloadDao.getDownloadsCountByStatus(listOf("Active", "Queued")) == 0){ if (UpdateUtil(this@MainActivity).updateYoutubeDL() == YoutubeDL.UpdateStatus.DONE) { @@ -251,8 +245,8 @@ class MainActivity : BaseActivity() { } } - } + } override fun onSaveInstanceState(savedInstanceState: Bundle) { super.onSaveInstanceState(savedInstanceState) savedInstanceState.putBundle("nav_state", navController.saveState()) @@ -489,10 +483,6 @@ class MainActivity : BaseActivity() { } dialog.show() } - override fun onConfigurationChanged(newConfig: Configuration) { - startActivity(Intent(this, MainActivity::class.java)) - super.onConfigurationChanged(newConfig) - } companion object { private const val TAG = "MainActivity" diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt index e68de198..14711a5f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt @@ -7,11 +7,6 @@ import com.deniscerri.ytdlnis.database.models.Format import com.deniscerri.ytdlnis.database.models.VideoPreferences import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.google.gson.Gson -import com.google.gson.reflect.TypeToken -import java.lang.reflect.Type -import java.text.SimpleDateFormat -import java.util.Calendar -import java.util.Locale class Converters { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt index 2224aa4a..101a84e0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt @@ -1,14 +1,9 @@ package com.deniscerri.ytdlnis.database import android.content.Context -import androidx.paging.Pager -import androidx.paging.PagingConfig -import androidx.paging.PagingData -import androidx.paging.PagingSource import androidx.room.* import com.deniscerri.ytdlnis.database.dao.* import com.deniscerri.ytdlnis.database.models.* -import kotlinx.coroutines.flow.Flow @TypeConverters(Converters::class) @Database( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt index f2393157..b3b1b8b3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt @@ -2,7 +2,6 @@ package com.deniscerri.ytdlnis.database.dao import androidx.room.* import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.models.TemplateShortcut import kotlinx.coroutines.flow.Flow @@ -48,10 +47,13 @@ interface CommandTemplateDao { fun getTotalShortcutNumber() : Int @Query("SELECT * FROM commandTemplates WHERE id=:id LIMIT 1") - fun getTemplate(id: Long) : CommandTemplate + fun getTemplate(id: Long) : CommandTemplate? + + @Query("SELECT * FROM commandTemplates WHERE content=:content LIMIT 1") + fun getTemplateByContent(content: String) : CommandTemplate? @Query("SELECT * FROM commandTemplates ORDER BY id DESC LIMIT 1") - fun getFirst() : CommandTemplate + fun getFirst() : CommandTemplate? @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insert(item: CommandTemplate) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt index 60b43857..be21f5e6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.database.dao import androidx.room.* -import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.models.LogItem import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt index 548771ff..707e87fa 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt @@ -1,10 +1,6 @@ package com.deniscerri.ytdlnis.database.dao -import androidx.paging.PagingSource import androidx.room.* -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.DownloadItemSimple -import com.deniscerri.ytdlnis.database.models.Format import com.deniscerri.ytdlnis.database.models.TerminalItem import kotlinx.coroutines.flow.Flow @@ -34,11 +30,12 @@ interface TerminalDao { val log = t.log ?: "" val lines = log.split("\n") //clean dublicate progress + add newline - val l = if (listOf(line, lines.last()).all { it.contains("[download")}){ - lines.dropLast(1).joinToString("\n") - }else{ - log - } + "\n${line}" + var newLine = line + if (newLine.contains("[download")){ + newLine = "[download]" + line.split("[download]").last() + } + + val l = lines.dropLastWhile { it.contains("[download") }.joinToString("\n") + "\n${newLine}" updateTerminalLog(l, id) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt index 638b3d4f..f8555724 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.database.models import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel @Entity(tableName = "downloads") data class DownloadItemSimple( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt index 5b132242..47e579b8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt @@ -3,6 +3,8 @@ package com.deniscerri.ytdlnis.database.models import com.google.gson.annotations.SerializedName data class GithubRelease( + @SerializedName(value = "html_url") + val html_url: String, @SerializedName(value = "tag_name") var tag_name: String, @SerializedName(value = "body") diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt index 5672dcbc..a8e9748f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt @@ -1,6 +1,5 @@ package com.deniscerri.ytdlnis.database.models -import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt index 4744d312..55fc0dd7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.database.models import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel @Entity(tableName = "terminalDownloads") data class TerminalItem( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt index f79b2f98..e189d202 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt @@ -1,10 +1,8 @@ package com.deniscerri.ytdlnis.database.repository -import androidx.lifecycle.LiveData import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.dao.CommandTemplateDao import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.models.TemplateShortcut import kotlinx.coroutines.flow.Flow @@ -37,7 +35,7 @@ class CommandTemplateRepository(private val commandDao: CommandTemplateDao) { } fun getItem(id: Long) : CommandTemplate { - return commandDao.getTemplate(id) + return commandDao.getTemplate(id)!! } suspend fun insert(item: CommandTemplate){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt index 2c042fd4..f14b9558 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt @@ -1,6 +1,5 @@ package com.deniscerri.ytdlnis.database.repository -import androidx.lifecycle.LiveData import com.deniscerri.ytdlnis.database.dao.CookieDao import com.deniscerri.ytdlnis.database.models.CookieItem import kotlinx.coroutines.flow.Flow diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt index 3a476f36..3c3b6ab8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.database.repository import com.deniscerri.ytdlnis.database.dao.LogDao -import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.models.LogItem import kotlinx.coroutines.flow.Flow @@ -16,6 +15,10 @@ class LogRepository(private val logDao: LogDao) { return logDao.getLogFlowByID(id) } + fun getLogByID(id: Long) : LogItem? { + return logDao.getByID(id) + } + suspend fun insert(item: LogItem) : Long{ return logDao.insert(item) @@ -31,13 +34,17 @@ class LogRepository(private val logDao: LogDao) { } fun getItem(id: Long) : LogItem{ - return logDao.getByID(id); + return logDao.getByID(id) } - suspend fun update(newLine: String, id: Long){ - val item = getItem(id) - item.content += "${newLine}\n" - logDao.update(item) + suspend fun update(line: String, id: Long){ + runCatching { + val item = getItem(id) + val log = item.content + //clean duplicate progress + add newline + //item.content = log.replace("(?s:.*\\n)?\\K\\[download\\]( *?)(\\d)(.*?)\\n(?!.*\\[download\\]( *?)(\\d)(.*?)\\n)".toRegex()).replac { it.contains("[download") }.joinToString("\n") + "\n${line}" + logDao.update(item) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt index 7abe1f8c..5f147926 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.database.repository import android.content.Context -import android.util.Log import com.deniscerri.ytdlnis.database.dao.ResultDao import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.util.InfoUtil diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt index 69421429..74c6546e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt @@ -12,10 +12,8 @@ import androidx.lifecycle.viewModelScope import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.models.CommandTemplate import com.deniscerri.ytdlnis.database.models.CommandTemplateExport -import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.models.TemplateShortcut import com.deniscerri.ytdlnis.database.repository.CommandTemplateRepository -import com.deniscerri.ytdlnis.database.repository.HistoryRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -28,8 +26,9 @@ class CommandTemplateViewModel(private val application: Application) : AndroidVi val sortOrder = MutableLiveData(DBManager.SORTING.DESC) val sortType = MutableLiveData(CommandTemplateRepository.CommandTemplateSortType.DATE) private val queryFilter = MutableLiveData("") - private var _items = MediatorLiveData>() + val allItems: LiveData> + private var _items = MediatorLiveData>() val shortcuts : LiveData> private val jsonFormat = Json { prettyPrint = true } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt index 7e4b7cc8..b10a588a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt @@ -6,6 +6,7 @@ import android.content.ClipboardManager import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase.OPEN_READONLY +import android.os.Environment import android.util.Log import android.webkit.CookieManager import androidx.lifecycle.AndroidViewModel @@ -17,6 +18,7 @@ import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.models.CookieItem import com.deniscerri.ytdlnis.database.repository.CookieRepository import com.deniscerri.ytdlnis.ui.more.WebViewActivity +import com.deniscerri.ytdlnis.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File @@ -169,4 +171,18 @@ class CookieViewModel(private val application: Application) : AndroidViewModel(a } } + fun exportToFile(exported: (File?) -> Unit) { + try{ + val cookieFile = File(application.cacheDir, "cookies.txt") + if (!cookieFile.exists()) updateCookiesFile() + + val downloads = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePath + File.separator + "YTDLnis_Cookies.txt") + val file = cookieFile.copyTo(downloads, true) + exported(file) + }catch (e: Exception){ + e.printStackTrace() + exported(null) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt index 47d716c3..df91c15e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt @@ -6,13 +6,11 @@ import android.content.SharedPreferences import android.content.res.Configuration import android.content.res.Resources import android.net.ConnectivityManager -import android.os.Bundle import android.os.Looper import android.util.DisplayMetrics import android.widget.Toast import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import androidx.paging.PagingData @@ -29,7 +27,6 @@ import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.dao.CommandTemplateDao import com.deniscerri.ytdlnis.database.dao.DownloadDao -import com.deniscerri.ytdlnis.database.dao.HistoryDao import com.deniscerri.ytdlnis.database.dao.ResultDao import com.deniscerri.ytdlnis.database.models.AudioPreferences import com.deniscerri.ytdlnis.database.models.CommandTemplate @@ -272,7 +269,10 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application } if (preferredAudioFormats.isEmpty()){ - preferredAudioFormats.add(getFormat(resultItem.formats, Type.audio).format_id) + val audioF = getFormat(resultItem.formats, Type.audio) + if (!infoUtil.getGenericAudioFormats(resources).contains(audioF)){ + preferredAudioFormats.add(audioF.format_id) + } } val videoPreferences = VideoPreferences( @@ -465,7 +465,12 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application ) } else -> { - val c = commandTemplateDao.getFirst() + val lastUsedCommandTemplate = sharedPreferences.getString("lastCommandTemplateUsed", "")!! + val c = if (lastUsedCommandTemplate.isBlank()){ + commandTemplateDao.getFirst() ?: CommandTemplate(0,"","", false) + }else{ + commandTemplateDao.getTemplateByContent(lastUsedCommandTemplate) ?: CommandTemplate(0, "", lastUsedCommandTemplate, false) + } return generateCommandFormat(c) } } @@ -474,7 +479,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application fun generateCommandFormat(c: CommandTemplate) : Format { return Format( c.title, - "", + c.id.toString(), "", "", "", @@ -486,7 +491,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application fun getLatestCommandTemplateAsFormat() : Format { - val t = commandTemplateDao.getFirst() + val t = commandTemplateDao.getFirst()!! return Format(t.title, "", "", "", "", 0, t.content) } @@ -591,7 +596,7 @@ class DownloadViewModel(application: Application) : AndroidViewModel(application startDownloadWorker(emptyList()) } - suspend fun queueDownloads(items: List, ignoreDuplicate : Boolean = false) { + suspend fun queueDownloads(items: List, ignoreDuplicate : Boolean = false) = CoroutineScope(Dispatchers.IO).launch { val context = App.instance val alarmScheduler = AlarmScheduler(context) val activeAndQueuedDownloads = withContext(Dispatchers.IO){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt index 9a1e6db5..91be95f5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt @@ -12,7 +12,6 @@ import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.repository.HistoryRepository import com.deniscerri.ytdlnis.database.DBManager.SORTING import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySortType -import com.deniscerri.ytdlnis.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -23,6 +22,7 @@ class HistoryViewModel(application: Application) : AndroidViewModel(application) val websiteFilter = MutableLiveData("") private val queryFilter = MutableLiveData("") private val formatFilter = MutableLiveData("") + val allItems : LiveData> private var _items = MediatorLiveData>() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt index 40880889..02c840c7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt @@ -1,7 +1,6 @@ package com.deniscerri.ytdlnis.database.viewmodel import android.app.Application -import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData @@ -11,7 +10,6 @@ import com.deniscerri.ytdlnis.database.models.LogItem import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.database.repository.LogRepository import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch class LogViewModel(private val application: Application) : AndroidViewModel(application) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt index d3f9918a..e993ae0f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt @@ -6,7 +6,6 @@ import android.util.Log import android.util.Patterns import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import androidx.preference.PreferenceManager @@ -17,10 +16,8 @@ import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.models.SearchHistoryItem import com.deniscerri.ytdlnis.database.repository.ResultRepository import com.deniscerri.ytdlnis.database.repository.SearchHistoryRepository -import com.deniscerri.ytdlnis.util.UiUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt index 35aae7c6..e2084bee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt @@ -1,62 +1,21 @@ package com.deniscerri.ytdlnis.database.viewmodel import android.app.Application -import android.content.Context -import android.content.SharedPreferences -import android.content.res.Configuration -import android.content.res.Resources -import android.net.ConnectivityManager -import android.os.Looper -import android.util.DisplayMetrics -import android.util.Log -import android.widget.Toast import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData -import androidx.lifecycle.asLiveData -import androidx.lifecycle.viewModelScope -import androidx.paging.PagingData -import androidx.preference.PreferenceManager -import androidx.work.Constraints import androidx.work.Data import androidx.work.ExistingWorkPolicy -import androidx.work.NetworkType import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkInfo import androidx.work.WorkManager -import androidx.work.await -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.dao.CommandTemplateDao -import com.deniscerri.ytdlnis.database.dao.DownloadDao -import com.deniscerri.ytdlnis.database.dao.ResultDao import com.deniscerri.ytdlnis.database.dao.TerminalDao -import com.deniscerri.ytdlnis.database.models.AudioPreferences -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.DownloadItemSimple -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.models.TerminalItem -import com.deniscerri.ytdlnis.database.models.VideoPreferences -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.work.AlarmScheduler -import com.deniscerri.ytdlnis.work.DownloadWorker import com.deniscerri.ytdlnis.work.TerminalDownloadWorker -import com.google.gson.Gson import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import java.io.File -import java.util.Locale -import java.util.concurrent.TimeUnit class TerminalViewModel(private val application: Application) : AndroidViewModel(application) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/AlarmStopReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/AlarmStopReceiver.kt index fcdbe3ec..b8f8d7f7 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/AlarmStopReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/AlarmStopReceiver.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.util.Log import androidx.preference.PreferenceManager import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.repository.DownloadRepository @@ -13,9 +12,7 @@ import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import java.text.SimpleDateFormat import java.util.Calendar -import java.util.Locale class AlarmStopReceiver : BroadcastReceiver() { override fun onReceive(p0: Context?, p1: Intent?) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt index a242c19e..b1917c28 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt @@ -4,7 +4,6 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.util.Log -import androidx.work.WorkManager import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.util.NotificationUtil @@ -12,7 +11,6 @@ import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking class CancelDownloadNotificationReceiver : BroadcastReceiver() { override fun onReceive(c: Context, intent: Intent) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt index ae2c415b..bfc49ae4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt @@ -3,16 +3,7 @@ package com.deniscerri.ytdlnis.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.util.Log import androidx.work.WorkManager -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.yausername.youtubedl_android.YoutubeDL -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking class CancelWorkReceiver : BroadcastReceiver() { override fun onReceive(c: Context, intent: Intent) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt index 54a21825..756de36e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt @@ -3,7 +3,6 @@ package com.deniscerri.ytdlnis.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import android.util.Log import com.deniscerri.ytdlnis.database.DBManager import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.util.NotificationUtil diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt index 4d34229b..b4d1a238 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt @@ -4,9 +4,11 @@ import android.content.Context import android.graphics.drawable.ColorDrawable import android.os.Build import android.os.Bundle +import android.util.Log import android.view.WindowManager import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat +import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.ui.BaseActivity import com.deniscerri.ytdlnis.util.NotificationUtil import com.deniscerri.ytdlnis.util.ThemeUtil @@ -36,10 +38,13 @@ class ShareFileActivity : BaseActivity() { } } + setContentView(R.layout.activity_share) + val paths = intent.getStringArrayExtra("path") val notificationId = intent.getIntExtra("notificationID", 0) NotificationUtil(this).cancelDownloadNotification(notificationId) - UiUtil.shareFileIntent(this, paths!!.toList()) + Log.e("SHAREE", paths.toString()) + UiUtil.shareFileIntent(this, paths!!.toList().filter { it.isNotBlank() }.distinct()) finishAffinity() } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt index f6574240..654a185b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt @@ -11,6 +11,7 @@ import android.os.Handler import android.os.Looper import android.text.Editable import android.util.Log +import android.util.Patterns import android.view.* import android.view.View.* import android.widget.* @@ -30,7 +31,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.MainActivity import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.adapter.HomeAdapter +import com.deniscerri.ytdlnis.ui.adapter.HomeAdapter import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel @@ -227,7 +228,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene launch{ resultViewModel.uiState.collectLatest { res -> if (res.errorMessage != null){ - kotlin.runCatching { UiUtil.handleResultResponse(requireActivity(), res) } + kotlin.runCatching { UiUtil.handleResultResponse(requireActivity(), res, closed ={}) } resultViewModel.uiState.update {it.copy(errorMessage = null, actions = null) } } @@ -557,7 +558,7 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, OnClickListene lifecycleScope.launch(Dispatchers.IO){ Thread.sleep(300) if(sharedPreferences!!.getBoolean("quick_download", false) || sharedPreferences!!.getString("preferred_download_type", "video") == "command"){ - if (queryList.size == 1 && queryList.first().matches("(https?://(?:www\\.|(?!www))[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|www\\.[a-zA-Z\\d][a-zA-Z\\d-]+[a-zA-Z\\d]\\.\\S{2,}|https?://(?:www\\.|(?!www))[a-zA-Z\\d]+\\.\\S{2,}|www\\.[a-zA-Z\\d]+\\.\\S{2,})".toRegex())){ + if (queryList.size == 1 && Patterns.WEB_URL.matcher(queryList.first()).matches()){ if (sharedPreferences!!.getBoolean("download_card", true)) { showSingleDownloadSheet( resultItem = downloadViewModel.createEmptyResultItem(queryList.first()), diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt index 8dc50782..f528c307 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt @@ -1,11 +1,10 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.content.SharedPreferences import android.graphics.Color import android.os.Handler import android.os.Looper -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -26,12 +25,11 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.progressindicator.LinearProgressIndicator -import com.google.android.material.shape.CornerFamily -import com.google.android.material.shape.ShapeAppearanceModel import com.squareup.picasso.Picasso -import java.lang.StringBuilder -class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private val sharedPreferences: SharedPreferences diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadMinifiedAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadMinifiedAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt index bac3a682..c3c22e37 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadMinifiedAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -19,18 +19,16 @@ import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.util.FileUtil import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView -import com.google.android.material.chip.Chip import com.google.android.material.progressindicator.LinearProgressIndicator -import com.google.android.material.shape.CornerFamily -import com.google.android.material.shape.ShapeAppearanceModel import com.squareup.picasso.Picasso import java.lang.StringBuilder -class ActiveDownloadMinifiedAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class ActiveDownloadMinifiedAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private val sharedPreferences: SharedPreferences @@ -132,13 +130,15 @@ class ActiveDownloadMinifiedAdapter(onItemClickListener: OnItemClickListener, ac pauseButton.setOnClickListener { if (pauseButton.tag == ActiveDownloadAdapter.ActiveDownloadAction.Pause){ - onItemClickListener.onPauseClick(item.id, ActiveDownloadAdapter.ActiveDownloadAction.Pause, position) + onItemClickListener.onPauseClick(item.id, + ActiveDownloadAdapter.ActiveDownloadAction.Pause, position) pauseButton.icon = ContextCompat.getDrawable(activity, R.drawable.exomedia_ic_play_arrow_white) if (progressBar.progress == 0) progressBar.isIndeterminate = false cancelButton.visibility = View.VISIBLE pauseButton.tag = ActiveDownloadAdapter.ActiveDownloadAction.Resume }else{ - onItemClickListener.onPauseClick(item.id, ActiveDownloadAdapter.ActiveDownloadAction.Resume, position) + onItemClickListener.onPauseClick(item.id, + ActiveDownloadAdapter.ActiveDownloadAction.Resume, position) pauseButton.icon = ContextCompat.getDrawable(activity, R.drawable.exomedia_ic_pause_white) progressBar.isIndeterminate = true cancelButton.visibility = View.GONE diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt index 326bda3c..9d57788c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ConfigureMultipleDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -24,7 +24,9 @@ import com.google.android.material.button.MaterialButton import com.squareup.picasso.Picasso import java.util.Locale -class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private val sharedPreferences : SharedPreferences @@ -35,7 +37,7 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener sharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity) } - class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { + class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val cardView: FrameLayout init { @@ -46,7 +48,7 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val cardView = LayoutInflater.from(parent.context) .inflate(R.layout.download_card, parent, false) - return ViewHolder(cardView, onItemClickListener) + return ViewHolder(cardView) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { @@ -136,11 +138,16 @@ class ConfigureMultipleDownloadsAdapter(onItemClickListener: OnItemClickListener card.setOnClickListener { onItemClickListener.onCardClick(item.url) } + + card.setOnLongClickListener { + onItemClickListener.onDelete(item.url); true + } } interface OnItemClickListener { fun onButtonClick(itemURL: String) fun onCardClick(itemURL: String) + fun onDelete(itemURL: String) } companion object { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt index c7ec1570..17da083d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/CookieAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt @@ -1,11 +1,10 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.AsyncDifferConfig import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter @@ -14,7 +13,9 @@ import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.CookieItem import com.google.android.material.card.MaterialCardView -class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt index 6f5c972e..8c2469a3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -6,25 +6,23 @@ import android.text.format.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.AsyncDifferConfig import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.LogItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.deniscerri.ytdlnis.util.FileUtil import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView -import java.io.File import java.text.SimpleDateFormat import java.util.Locale -class DownloadLogsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class DownloadLogsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private val checkedItems: ArrayList diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt index 16518b30..042ed384 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/GenericDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -10,13 +10,11 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView -import androidx.core.view.isVisible import androidx.paging.PagingDataAdapter import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.DownloadItemSimple import com.deniscerri.ytdlnis.database.repository.DownloadRepository import com.deniscerri.ytdlnis.util.FileUtil @@ -24,7 +22,9 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.squareup.picasso.Picasso -class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : PagingDataAdapter(DIFF_CALLBACK) { +class GenericDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : PagingDataAdapter( + DIFF_CALLBACK +) { private val onItemClickListener: OnItemClickListener private val activity: Activity val checkedItems: ArrayList diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt index 2e375b10..06973fb4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -24,13 +24,16 @@ import com.deniscerri.ytdlnis.database.models.HistoryItem import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView +import com.google.android.material.floatingactionbutton.FloatingActionButton import com.squareup.picasso.Picasso import java.io.File import java.text.SimpleDateFormat import java.util.* -class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val checkedItems: ArrayList private val onItemClickListener: OnItemClickListener private val activity: Activity @@ -105,7 +108,7 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit datetime.text = SimpleDateFormat(android.text.format.DateFormat.getBestDateTimePattern(Locale.getDefault(), "ddMMMyyyy - HHmm"), Locale.getDefault()).format(item.time * 1000L) // BUTTON ---------------------------------- - val btn = card.findViewById(R.id.downloads_download_button_type) + val btn = card.findViewById(R.id.downloads_download_button_type) var filePresent = true //IS IN THE FILE SYSTEM? @@ -121,11 +124,11 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit thumbnail.alpha = 0.7f } if (item.type == DownloadViewModel.Type.audio) { - if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music) + if (filePresent) btn.setImageResource(R.drawable.ic_music_downloaded) else btn.setImageResource(R.drawable.ic_music) } else if (item.type == DownloadViewModel.Type.video) { - if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) + if (filePresent) btn.setImageResource(R.drawable.ic_video_downloaded) else btn.setImageResource(R.drawable.ic_video) }else{ - btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_terminal) + btn.setImageResource(R.drawable.ic_terminal) } if (btn.hasOnClickListeners()) btn.setOnClickListener(null) btn.isClickable = filePresent diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt index 02378614..aa1c9e88 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -9,9 +9,7 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.ImageView -import android.widget.LinearLayout import android.widget.TextView -import androidx.preference.Preference import androidx.preference.PreferenceManager import androidx.recyclerview.widget.AsyncDifferConfig import androidx.recyclerview.widget.DiffUtil @@ -25,7 +23,9 @@ import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.LinearProgressIndicator import com.squareup.picasso.Picasso -class HomeAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class HomeAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val checkedVideos: ArrayList private val onItemClickListener: OnItemClickListener private val activity: Activity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt index 76719fce..91343170 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/PlaylistAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -21,11 +21,12 @@ import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.ResultItem import com.squareup.picasso.Picasso -import org.w3c.dom.Text import java.util.* -class PlaylistAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class PlaylistAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val checkedItems: ArrayList private val onItemClickListener: OnItemClickListener private val activity: Activity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt similarity index 57% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt index 2d99590d..170a0b94 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt @@ -1,23 +1,26 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter +import android.annotation.SuppressLint import android.app.Activity -import android.opengl.Visibility import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.AsyncDifferConfig import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R import com.deniscerri.ytdlnis.database.models.CommandTemplate +import com.deniscerri.ytdlnis.database.models.LogItem import com.google.android.material.card.MaterialCardView -class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity + private val checkedItems: ArrayList = ArrayList() init { this.onItemClickListener = onItemClickListener @@ -52,19 +55,74 @@ class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activ if (item!!.useAsExtraCommand) useInExtraCommands.visibility = View.VISIBLE else useInExtraCommands.visibility = View.GONE + if (checkedItems.contains(item.id)) { + card.isChecked = true + card.strokeWidth = 5 + } else { + card.isChecked = false + card.strokeWidth = 0 + } card.setOnClickListener { - onItemClickListener.onItemClick(item, position) + if (checkedItems.size > 0) { + checkCard(card, item.id) + } else { + onItemClickListener.onItemClick(item, position) + } } card.setOnLongClickListener { - onItemClickListener.onDelete(item); true + checkCard(card, item.id) + true } } + @SuppressLint("NotifyDataSetChanged") + fun clearCheckeditems() { + for (i in 0 until itemCount){ + val item = getItem(i) + if (checkedItems.find { it == item?.id } != null){ + checkedItems.remove(item?.id) + notifyItemChanged(i) + } + } + + checkedItems.clear() + } + + @SuppressLint("NotifyDataSetChanged") + fun checkAll(items: List?){ + checkedItems.clear() + checkedItems.addAll(items!!.map { it!!.id }) + notifyDataSetChanged() + } + + @SuppressLint("NotifyDataSetChanged") + fun invertSelected(items: List?){ + val invertedList = mutableListOf() + items?.forEach { + if (!checkedItems.contains(it!!.id)) invertedList.add(it.id) + } + checkedItems.clear() + checkedItems.addAll(invertedList) + notifyDataSetChanged() + } + + private fun checkCard(card: MaterialCardView, itemID: Long) { + if (card.isChecked) { + card.strokeWidth = 0 + checkedItems.remove(itemID) + } else { + card.strokeWidth = 5 + checkedItems.add(itemID) + } + card.isChecked = !card.isChecked + onItemClickListener.onCardSelect(itemID, card.isChecked) + } + interface OnItemClickListener { fun onItemClick(commandTemplate: CommandTemplate, index: Int) fun onSelected(commandTemplate: CommandTemplate) - fun onDelete(commandTemplate: CommandTemplate) + fun onCardSelect(itemID: Long, isChecked: Boolean) } companion object { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TerminalDownloadsAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/adapter/TerminalDownloadsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt index 46ce9e83..6de8872b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/TerminalDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.adapter +package com.deniscerri.ytdlnis.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -17,7 +17,9 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.LinearProgressIndicator -class TerminalDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { +class TerminalDownloadsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( + DIFF_CALLBACK +).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity private val sharedPreferences: SharedPreferences diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt index 060a69ab..00936e27 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt @@ -4,11 +4,8 @@ import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.content.DialogInterface -import android.content.Intent import android.content.SharedPreferences -import android.graphics.Color import android.os.Bundle -import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -25,17 +22,12 @@ import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel import com.deniscerri.ytdlnis.util.InfoUtil import com.deniscerri.ytdlnis.util.UiUtil import com.deniscerri.ytdlnis.util.UiUtil.enableTextHighlight -import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment -import com.neo.highlight.core.Highlight -import com.neo.highlight.util.listener.HighlightTextWatcher -import com.neo.highlight.util.scheme.ColorScheme import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.util.* -import java.util.regex.Pattern class AddExtraCommandsDialog(private val item: DownloadItem?, private val callback: ExtraCommandsListener) : BottomSheetDialogFragment() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt index 9164d506..aa6d3ce5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt @@ -12,7 +12,6 @@ import android.view.ViewGroup import android.widget.Button import android.widget.Toast import androidx.core.content.edit -import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager @@ -179,10 +178,10 @@ class ConfigureDownloadBottomSheetDialog(private var result: ResultItem, private val link = view.findViewById