diff --git a/app/build.gradle b/app/build.gradle index d38a1712..32e3ba0c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,14 +12,14 @@ def versionMajor = 1 def versionMinor = 7 def versionPatch = 4 def versionBuild = 0 // bump for dogfood builds, public betas, etc. -def versionExt = ".${versionBuild}" +def versionExt = "" if (versionBuild > 0){ versionExt = ".${versionBuild}-beta" } android { - namespace 'com.deniscerri.ytdlnis' + namespace 'com.deniscerri.ytdl' compileSdk 34 try { diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index c961e1c6..cf608782 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -22,10 +22,10 @@ -if @kotlinx.serialization.Serializable class ** -keep class androidx.lifecycle.LiveData { *; } -keep class com.google.gson.** { *; } --keep class com.deniscerri.ytdlnis.database.models.AudioPreferences --keep class com.deniscerri.ytdlnis.database.models.VideoPreferences --keep class com.deniscerri.ytdlnis.database.models.GithubRelease --keep class com.deniscerri.ytdlnis.database.models.GithubReleaseAsset +-keep class com.deniscerri.ytdl.database.models.AudioPreferences +-keep class com.deniscerri.ytdl.database.models.VideoPreferences +-keep class com.deniscerri.ytdl.database.models.GithubRelease +-keep class com.deniscerri.ytdl.database.models.GithubReleaseAsset -keepclassmembers,allowobfuscation class * { @com.google.gson.annotations.SerializedName ; } diff --git a/app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json b/app/schemas/com.deniscerri.ytdl.data.DBManager/11.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.data.DBManager/11.json rename to app/schemas/com.deniscerri.ytdl.data.DBManager/11.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/1.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/1.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/1.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/10.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/10.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/10.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/10.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/11.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/11.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/11.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/11.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/12.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/12.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/12.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/12.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/13.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/13.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/13.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/13.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/14.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/14.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/14.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/14.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/15.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/15.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/15.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/15.json diff --git a/app/schemas/com.deniscerri.ytdl.database.DBManager/16.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/16.json new file mode 100644 index 00000000..5c646857 --- /dev/null +++ b/app/schemas/com.deniscerri.ytdl.database.DBManager/16.json @@ -0,0 +1,718 @@ +{ + "formatVersion": 1, + "database": { + "version": 16, + "identityHash": "6d3700c5756542e79e6368575533f6ed", + "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, `playlistURL` TEXT DEFAULT '', `playlistIndex` INTEGER, `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": "playlistURL", + "columnName": "playlistURL", + "affinity": "TEXT", + "notNull": false, + "defaultValue": "''" + }, + { + "fieldPath": "playlistIndex", + "columnName": "playlistIndex", + "affinity": "INTEGER", + "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, `playlistURL` TEXT DEFAULT '', `playlistIndex` 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 + }, + { + "fieldPath": "playlistURL", + "columnName": "playlistURL", + "affinity": "TEXT", + "notNull": false, + "defaultValue": "''" + }, + { + "fieldPath": "playlistIndex", + "columnName": "playlistIndex", + "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, `useAsExtraCommandAudio` INTEGER NOT NULL DEFAULT 1, `useAsExtraCommandVideo` INTEGER NOT NULL DEFAULT 1)", + "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" + }, + { + "fieldPath": "useAsExtraCommandAudio", + "columnName": "useAsExtraCommandAudio", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "useAsExtraCommandVideo", + "columnName": "useAsExtraCommandVideo", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + } + ], + "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": [] + }, + { + "tableName": "sources", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `downloadItemTemplate` TEXT NOT NULL, `everyNr` INTEGER NOT NULL, `everyCategory` TEXT NOT NULL, `everyTime` INTEGER NOT NULL, `weeklyConfig` TEXT, `monthlyConfig` TEXT, `status` TEXT NOT NULL, `startsTime` INTEGER NOT NULL, `endsDate` INTEGER NOT NULL DEFAULT 0, `endsAfterCount` INTEGER NOT NULL DEFAULT 0, `runCount` INTEGER NOT NULL DEFAULT 0, `getOnlyNewUploads` INTEGER NOT NULL DEFAULT 0, `retryMissingDownloads` INTEGER NOT NULL, `alreadyProcessedLinks` TEXT NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "downloadItemTemplate", + "columnName": "downloadItemTemplate", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "everyNr", + "columnName": "everyNr", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "everyCategory", + "columnName": "everyCategory", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "everyTime", + "columnName": "everyTime", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "weeklyConfig", + "columnName": "weeklyConfig", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "monthlyConfig", + "columnName": "monthlyConfig", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "startsTime", + "columnName": "startsTime", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "endsDate", + "columnName": "endsDate", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "endsAfterCount", + "columnName": "endsAfterCount", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "runCount", + "columnName": "runCount", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "getOnlyNewUploads", + "columnName": "getOnlyNewUploads", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "retryMissingDownloads", + "columnName": "retryMissingDownloads", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "alreadyProcessedLinks", + "columnName": "alreadyProcessedLinks", + "affinity": "TEXT", + "notNull": true + } + ], + "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, '6d3700c5756542e79e6368575533f6ed')" + ] + } +} \ No newline at end of file diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/2.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/2.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/2.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/2.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/3.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/3.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/3.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/3.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/4.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/4.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/4.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/4.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/5.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/5.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/5.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/5.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/6.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/6.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/6.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/6.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/7.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/7.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/7.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/8.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/8.json diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/9.json b/app/schemas/com.deniscerri.ytdl.database.DBManager/9.json similarity index 100% rename from app/schemas/com.deniscerri.ytdlnis.database.DBManager/9.json rename to app/schemas/com.deniscerri.ytdl.database.DBManager/9.json diff --git a/app/src/androidTest/java/com/deniscerri/ytdlnis/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/deniscerri/ytdl/ExampleInstrumentedTest.kt similarity index 95% rename from app/src/androidTest/java/com/deniscerri/ytdlnis/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/com/deniscerri/ytdl/ExampleInstrumentedTest.kt index b73ac878..a8129f1b 100644 --- a/app/src/androidTest/java/com/deniscerri/ytdlnis/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/com/deniscerri/ytdl/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis +package com.deniscerri.ytdl import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2f02a4bb..07e26678 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ android:maxSdkVersion="32" /> + @@ -18,10 +19,7 @@ - - + + + + + + @@ -302,6 +305,7 @@ android:launchMode="singleTask" android:targetActivity=".MainActivity" android:windowSoftInputMode="adjustPan"> + @@ -323,6 +327,7 @@ android:launchMode="singleTask" android:targetActivity=".MainActivity" android:windowSoftInputMode="adjustPan"> + @@ -351,9 +356,6 @@ - - - { + navController.navigate(R.id.historyFragment) + } + "Queue" -> { + navController.navigate(R.id.downloadQueueMainFragment) + } + "Search" -> { + val bundle = Bundle() + bundle.putBoolean("search", true) + navController.popBackStack(R.id.homeFragment, true) + navController.navigate( + R.id.homeFragment, + bundle + ) + } + } } } @@ -425,88 +444,6 @@ class MainActivity : BaseActivity() { } } - private fun askPermissions() { - val permissions = arrayListOf() - if (!checkFilePermission()) { - if (Build.VERSION.SDK_INT >= 33){ - permissions.add(Manifest.permission.READ_MEDIA_AUDIO) - permissions.add(Manifest.permission.READ_MEDIA_VIDEO) - }else{ - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE) - permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE) - } - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - if (!checkNotificationPermission()){ - permissions.add(Manifest.permission.POST_NOTIFICATIONS) - } - } - - if (permissions.isNotEmpty()){ - ActivityCompat.requestPermissions( - this, - permissions.toTypedArray(), - 1 - ) - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - for (i in permissions.indices) { - if (permissions.contains(Manifest.permission.POST_NOTIFICATIONS)) continue - if (grantResults[i] == PackageManager.PERMISSION_DENIED) { - createPermissionRequestDialog() - } - } - } - - private fun exit() { - finishAffinity() - exitProcess(0) - } - - private fun checkFilePermission(): Boolean { - return if(Build.VERSION.SDK_INT >= 33){ - (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) - == PackageManager.PERMISSION_GRANTED) && - (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VIDEO) - == PackageManager.PERMISSION_GRANTED) - }else{ - (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) && - (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) - } - } - - @RequiresApi(Build.VERSION_CODES.TIRAMISU) - private fun checkNotificationPermission(): Boolean { - return (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) - == PackageManager.PERMISSION_GRANTED) - } - - private fun createPermissionRequestDialog() { - val dialog = MaterialAlertDialogBuilder(this) - dialog.setTitle(getString(R.string.warning)) - dialog.setMessage(getString(R.string.request_permission_desc)) - dialog.setOnCancelListener { exit() } - dialog.setNegativeButton(getString(R.string.exit_app)) { _: DialogInterface?, _: Int -> exit() } - dialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> - val intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - Uri.fromParts("package", packageName, null) - ) - startActivity(intent) - exitProcess(0) - } - dialog.show() - } - 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/ytdl/database/Converters.kt similarity index 70% rename from app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt rename to app/src/main/java/com/deniscerri/ytdl/database/Converters.kt index 4ba3c4a3..58a9c57f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/Converters.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/Converters.kt @@ -1,12 +1,14 @@ -package com.deniscerri.ytdlnis.database +package com.deniscerri.ytdl.database import androidx.room.TypeConverter -import com.deniscerri.ytdlnis.database.models.AudioPreferences -import com.deniscerri.ytdlnis.database.models.ChapterItem -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.VideoPreferences -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.models.AudioPreferences +import com.deniscerri.ytdl.database.models.ChapterItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.VideoPreferences +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesMonthlyConfig +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesWeeklyConfig +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel import com.google.gson.Gson @@ -73,4 +75,17 @@ class Converters { @TypeConverter fun stringtoMutableListofStrings(s: String) = Gson().fromJson(s, Array::class.java).toMutableList() + + @TypeConverter + fun observeSourcesWeeklyConfigToString(c: ObserveSourcesWeeklyConfig) = Gson().toJson(c) + + @TypeConverter + fun stringToObserveSourcesWeeklyConfig(s: String) = Gson().fromJson(s, ObserveSourcesWeeklyConfig::class.java) + + @TypeConverter + fun observeSourcesMonthlyConfigToString(c: ObserveSourcesMonthlyConfig) = Gson().toJson(c) + + @TypeConverter + fun stringToObserveSourcesMonthlyConfig(s: String) = Gson().fromJson(s, ObserveSourcesMonthlyConfig::class.java) + } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt b/app/src/main/java/com/deniscerri/ytdl/database/DBManager.kt similarity index 66% rename from app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt rename to app/src/main/java/com/deniscerri/ytdl/database/DBManager.kt index 749b28d3..58d491b5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/DBManager.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/DBManager.kt @@ -1,30 +1,31 @@ -package com.deniscerri.ytdlnis.database +package com.deniscerri.ytdl.database import android.content.Context import androidx.room.AutoMigration import androidx.room.Database +import androidx.room.DeleteTable import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters -import com.deniscerri.ytdlnis.database.dao.CommandTemplateDao -import com.deniscerri.ytdlnis.database.dao.CookieDao -import com.deniscerri.ytdlnis.database.dao.DownloadDao -import com.deniscerri.ytdlnis.database.dao.HistoryDao -import com.deniscerri.ytdlnis.database.dao.LogDao -import com.deniscerri.ytdlnis.database.dao.ObserveSourcesDao -import com.deniscerri.ytdlnis.database.dao.ResultDao -import com.deniscerri.ytdlnis.database.dao.SearchHistoryDao -import com.deniscerri.ytdlnis.database.dao.TerminalDao -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.CookieItem -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.models.SearchHistoryItem -import com.deniscerri.ytdlnis.database.models.TemplateShortcut -import com.deniscerri.ytdlnis.database.models.TerminalItem +import com.deniscerri.ytdl.database.dao.CommandTemplateDao +import com.deniscerri.ytdl.database.dao.CookieDao +import com.deniscerri.ytdl.database.dao.DownloadDao +import com.deniscerri.ytdl.database.dao.HistoryDao +import com.deniscerri.ytdl.database.dao.LogDao +import com.deniscerri.ytdl.database.dao.ObserveSourcesDao +import com.deniscerri.ytdl.database.dao.ResultDao +import com.deniscerri.ytdl.database.dao.SearchHistoryDao +import com.deniscerri.ytdl.database.dao.TerminalDao +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.models.SearchHistoryItem +import com.deniscerri.ytdl.database.models.TemplateShortcut +import com.deniscerri.ytdl.database.models.TerminalItem @TypeConverters(Converters::class) @Database( @@ -40,7 +41,7 @@ import com.deniscerri.ytdlnis.database.models.TerminalItem TerminalItem::class, ObserveSourcesItem::class ], - version = 15, + version = 16, autoMigrations = [ AutoMigration (from = 1, to = 2), AutoMigration (from = 2, to = 3), @@ -56,6 +57,7 @@ import com.deniscerri.ytdlnis.database.models.TerminalItem AutoMigration (from = 12, to = 13), // AutoMigration (from = 13, to = 14) MANUALLY HANDLED AutoMigration (from = 14, to = 15), + AutoMigration (from = 15, to = 16, spec = Migrations.resetObserveSources::class) ] ) abstract class DBManager : RoomDatabase(){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/Migrations.kt b/app/src/main/java/com/deniscerri/ytdl/database/Migrations.kt similarity index 74% rename from app/src/main/java/com/deniscerri/ytdlnis/database/Migrations.kt rename to app/src/main/java/com/deniscerri/ytdl/database/Migrations.kt index e551df41..caf17595 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/Migrations.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/Migrations.kt @@ -1,7 +1,10 @@ -package com.deniscerri.ytdlnis.database +package com.deniscerri.ytdl.database import android.annotation.SuppressLint +import androidx.room.DeleteTable +import androidx.room.migration.AutoMigrationSpec import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase object Migrations { @@ -23,6 +26,18 @@ object Migrations { } ) + @DeleteTable.Entries( + DeleteTable( + tableName = "observeSources" + ) + ) + class resetObserveSources : AutoMigrationSpec { + @Override + override fun onPostMigrate(db: SupportSQLiteDatabase) { + // Invoked once auto migration is done + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/CommandTemplateDao.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/CommandTemplateDao.kt index ed82344d..81b77dde 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CommandTemplateDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/CommandTemplateDao.kt @@ -1,12 +1,12 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.TemplateShortcut +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.TemplateShortcut import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CookieDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/CookieDao.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/CookieDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/CookieDao.kt index f4426698..d284b732 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/CookieDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/CookieDao.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.CookieItem +import com.deniscerri.ytdl.database.models.CookieItem import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/DownloadDao.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/DownloadDao.kt index 313329f3..d8aa09c4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/DownloadDao.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.paging.PagingSource import androidx.room.Dao @@ -9,9 +9,9 @@ import androidx.room.RewriteQueriesToDropUnusedColumns import androidx.room.Transaction import androidx.room.Update import androidx.room.Upsert -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.DownloadItemSimple -import com.deniscerri.ytdlnis.database.models.Format +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.DownloadItemSimple +import com.deniscerri.ytdl.database.models.Format import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/HistoryDao.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/HistoryDao.kt index 7acbc849..a07fbdf3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/HistoryDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/HistoryDao.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.HistoryItem import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/LogDao.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/LogDao.kt index 9c8544dc..19939da4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/LogDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/LogDao.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert @@ -6,7 +6,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.LogItem +import com.deniscerri.ytdl.database.models.LogItem import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ObserveSourcesDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/ObserveSourcesDao.kt similarity index 58% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/ObserveSourcesDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/ObserveSourcesDao.kt index 767bf711..ff814d0b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ObserveSourcesDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/ObserveSourcesDao.kt @@ -1,37 +1,37 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem import kotlinx.coroutines.flow.Flow @Dao interface ObserveSourcesDao { - @Query("SELECT * FROM observeSources ORDER BY id DESC") + @Query("SELECT * FROM sources ORDER BY id DESC") fun getAllSources() : List - @Query("SELECT * FROM observeSources WHERE url = :url LIMIT 1") + @Query("SELECT * FROM sources WHERE url = :url LIMIT 1") fun getByURL(url: String) : ObserveSourcesItem - @Query("SELECT * FROM observeSources WHERE id = :id LIMIT 1") + @Query("SELECT * FROM sources WHERE id = :id LIMIT 1") fun getByID(id: Long) : ObserveSourcesItem - @Query("SELECT * FROM observeSources ORDER BY id DESC") + @Query("SELECT * FROM sources ORDER BY id DESC") fun getAllSourcesFlow() : Flow> - @Query("SELECT EXISTS(SELECT * FROM observeSources WHERE url=:url LIMIT 1)") + @Query("SELECT EXISTS(SELECT * FROM sources WHERE url=:url LIMIT 1)") fun checkIfExistsWithSameURL(url: String) : Boolean @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insert(item: ObserveSourcesItem) : Long - @Query("DELETE FROM observeSources") + @Query("DELETE FROM sources") suspend fun deleteAll() - @Query("DELETE FROM observeSources WHERE id=:itemId") + @Query("DELETE FROM sources WHERE id=:itemId") suspend fun delete(itemId: Long) @Update(onConflict = OnConflictStrategy.REPLACE) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/ResultDao.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/ResultDao.kt index cc0728bd..b72fe343 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/ResultDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/ResultDao.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert @@ -6,7 +6,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction import androidx.room.Update -import com.deniscerri.ytdlnis.database.models.ResultItem +import com.deniscerri.ytdl.database.models.ResultItem import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/SearchHistoryDao.kt similarity index 86% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/SearchHistoryDao.kt index fcaebc8c..a2cfaed1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/SearchHistoryDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/SearchHistoryDao.kt @@ -1,10 +1,10 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.deniscerri.ytdlnis.database.models.SearchHistoryItem +import com.deniscerri.ytdl.database.models.SearchHistoryItem @Dao interface SearchHistoryDao { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt b/app/src/main/java/com/deniscerri/ytdl/database/dao/TerminalDao.kt similarity index 88% rename from app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt rename to app/src/main/java/com/deniscerri/ytdl/database/dao/TerminalDao.kt index 945fc29a..f86cbf7c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/TerminalDao.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/dao/TerminalDao.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.database.dao +package com.deniscerri.ytdl.database.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.Query import androidx.room.Transaction -import com.deniscerri.ytdlnis.database.models.TerminalItem -import com.deniscerri.ytdlnis.util.Extensions.appendLineToLog +import com.deniscerri.ytdl.database.models.TerminalItem +import com.deniscerri.ytdl.util.Extensions.appendLineToLog import kotlinx.coroutines.flow.Flow @Dao diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/AudioPreferences.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/AudioPreferences.kt similarity index 86% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/AudioPreferences.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/AudioPreferences.kt index fdd7ac83..2331bd57 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/AudioPreferences.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/AudioPreferences.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/ChapterItem.kt similarity index 88% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/ChapterItem.kt index 2cfa0904..9aa66794 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ChapterItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/ChapterItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import com.google.gson.annotations.SerializedName diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplate.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplate.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplate.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplate.kt index c87c9002..4003cda6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplate.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplate.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplateExport.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplateExport.kt similarity index 79% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplateExport.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplateExport.kt index 2074533b..69a69d37 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CommandTemplateExport.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/CommandTemplateExport.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import kotlinx.serialization.Serializable diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CookieItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/CookieItem.kt similarity index 82% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/CookieItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/CookieItem.kt index 1cd9b224..94833e60 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/CookieItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/CookieItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItem.kt similarity index 91% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItem.kt index a0d445ce..30f393e1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItem.kt @@ -1,10 +1,10 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel import kotlinx.parcelize.Parcelize @Entity(tableName = "downloads") diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItemSimple.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItemSimple.kt index f8555724..d7261770 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItemSimple.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/DownloadItemSimple.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/Format.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/Format.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/Format.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/Format.kt index d9a338ba..a35f22bd 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/Format.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/Format.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import com.google.gson.annotations.SerializedName diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/GithubRelease.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/GithubRelease.kt index 32f20714..da8d7ceb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/GithubRelease.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/GithubRelease.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import com.google.gson.annotations.SerializedName import java.util.Date diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/HistoryItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/HistoryItem.kt similarity index 83% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/HistoryItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/HistoryItem.kt index b8b885ce..097d7ba0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/HistoryItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/HistoryItem.kt @@ -1,9 +1,9 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel @Entity(tableName = "history") data class HistoryItem( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/LogItem.kt similarity index 73% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/LogItem.kt index a8e9748f..8c57b814 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/LogItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/LogItem.kt @@ -1,8 +1,8 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel @Entity(tableName = "logs") data class LogItem( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/ResultItem.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/ResultItem.kt index 914b7e53..68d119fa 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ResultItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/ResultItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import androidx.room.ColumnInfo diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchHistoryItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/SearchHistoryItem.kt similarity index 81% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchHistoryItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/SearchHistoryItem.kt index 7376005a..a8e934f3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchHistoryItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/SearchHistoryItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchSuggestionItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/SearchSuggestionItem.kt similarity index 77% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchSuggestionItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/SearchSuggestionItem.kt index acc171ca..f2ad2f0c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/SearchSuggestionItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/SearchSuggestionItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models data class SearchSuggestionItem( var text: String, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TemplateShortcut.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/TemplateShortcut.kt similarity index 85% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/TemplateShortcut.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/TemplateShortcut.kt index 4f32714c..cb7f2a58 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TemplateShortcut.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/TemplateShortcut.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/TerminalItem.kt similarity index 86% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/TerminalItem.kt index 55fc0dd7..ccd0f34e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/TerminalItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/TerminalItem.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import androidx.room.ColumnInfo import androidx.room.Entity diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/VideoPreferences.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/VideoPreferences.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/VideoPreferences.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/VideoPreferences.kt index 673c472f..8941a875 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/VideoPreferences.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/VideoPreferences.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models import android.os.Parcelable import kotlinx.parcelize.Parcelize diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ObserveSourcesItem.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesItem.kt similarity index 73% rename from app/src/main/java/com/deniscerri/ytdlnis/database/models/ObserveSourcesItem.kt rename to app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesItem.kt index 8533262f..1153f58f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/ObserveSourcesItem.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesItem.kt @@ -1,14 +1,15 @@ -package com.deniscerri.ytdlnis.database.models +package com.deniscerri.ytdl.database.models.observeSources import android.os.Parcelable import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository import kotlinx.parcelize.Parcelize import java.time.Month -@Entity(tableName = "observeSources") +@Entity(tableName = "sources") @Parcelize data class ObserveSourcesItem( @PrimaryKey(autoGenerate = true) @@ -16,14 +17,15 @@ data class ObserveSourcesItem( var name: String, var url: String, var downloadItemTemplate: DownloadItem, - var status: ObserveSourcesRepository.SourceStatus, + var everyNr: Int, var everyCategory: ObserveSourcesRepository.EveryCategory, - val everyWeekDay: List, - val everyMonthDay: Int, val everyTime: Long, + var weeklyConfig: ObserveSourcesWeeklyConfig?, + var monthlyConfig: ObserveSourcesMonthlyConfig?, + + var status: ObserveSourcesRepository.SourceStatus, var startsTime: Long, - val startsMonth: Month, @ColumnInfo(defaultValue = "0") var endsDate: Long, @ColumnInfo(defaultValue = "0") diff --git a/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesMonthlyConfig.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesMonthlyConfig.kt new file mode 100644 index 00000000..600183dd --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesMonthlyConfig.kt @@ -0,0 +1,11 @@ +package com.deniscerri.ytdl.database.models.observeSources + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize +import java.time.Month + +@Parcelize +data class ObserveSourcesMonthlyConfig( + var everyMonthDay: Int, + var startsMonth: Int +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesWeeklyConfig.kt b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesWeeklyConfig.kt new file mode 100644 index 00000000..89fec26a --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/database/models/observeSources/ObserveSourcesWeeklyConfig.kt @@ -0,0 +1,9 @@ +package com.deniscerri.ytdl.database.models.observeSources + +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize +data class ObserveSourcesWeeklyConfig( + var weekDays: List +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/CommandTemplateRepository.kt similarity index 87% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/CommandTemplateRepository.kt index e189d202..06b28cd1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CommandTemplateRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/CommandTemplateRepository.kt @@ -1,9 +1,9 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository -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.TemplateShortcut +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.dao.CommandTemplateDao +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.TemplateShortcut import kotlinx.coroutines.flow.Flow class CommandTemplateRepository(private val commandDao: CommandTemplateDao) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/CookieRepository.kt similarity index 82% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/CookieRepository.kt index e6cb4335..3cc0bb70 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/CookieRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/CookieRepository.kt @@ -1,7 +1,7 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository -import com.deniscerri.ytdlnis.database.dao.CookieDao -import com.deniscerri.ytdlnis.database.models.CookieItem +import com.deniscerri.ytdl.database.dao.CookieDao +import com.deniscerri.ytdl.database.models.CookieItem import kotlinx.coroutines.flow.Flow class CookieRepository(private val cookieDao: CookieDao) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/DownloadRepository.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/DownloadRepository.kt index 7b9e98ef..8df90b36 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/DownloadRepository.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository import android.annotation.SuppressLint import android.content.Context @@ -16,14 +16,14 @@ 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.dao.DownloadDao -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.DownloadItemSimple -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.work.DownloadWorker +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.dao.DownloadDao +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.DownloadItemSimple +import com.deniscerri.ytdl.util.Extensions.toListString +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.work.DownloadWorker import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import java.io.File diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/HistoryRepository.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/HistoryRepository.kt index 21afdb7c..74da9373 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/HistoryRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/HistoryRepository.kt @@ -1,9 +1,9 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository -import com.deniscerri.ytdlnis.database.DBManager.SORTING -import com.deniscerri.ytdlnis.database.dao.HistoryDao -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.database.DBManager.SORTING +import com.deniscerri.ytdl.database.dao.HistoryDao +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.util.FileUtil import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/LogRepository.kt similarity index 82% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/LogRepository.kt index f5712b7c..7344ec9b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/LogRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/LogRepository.kt @@ -1,8 +1,8 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository -import com.deniscerri.ytdlnis.database.dao.LogDao -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.util.Extensions.appendLineToLog +import com.deniscerri.ytdl.database.dao.LogDao +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.util.Extensions.appendLineToLog import kotlinx.coroutines.flow.Flow class LogRepository(private val logDao: LogDao) { diff --git a/app/src/main/java/com/deniscerri/ytdl/database/repository/ObserveSourcesRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/ObserveSourcesRepository.kt new file mode 100644 index 00000000..fc04aa2b --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/ObserveSourcesRepository.kt @@ -0,0 +1,61 @@ +package com.deniscerri.ytdl.database.repository + +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.dao.ObserveSourcesDao +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import kotlinx.coroutines.flow.Flow + +class ObserveSourcesRepository(private val observeSourcesDao: ObserveSourcesDao) { + val items : Flow> = observeSourcesDao.getAllSourcesFlow() + enum class SourceStatus { + ACTIVE, STOPPED + } + + enum class EveryCategory { + HOUR, DAY, WEEK, MONTH + } + + companion object { + val everyCategoryName = mapOf( + EveryCategory.HOUR to R.string.hour, + EveryCategory.DAY to R.string.day, + EveryCategory.WEEK to R.string.week, + EveryCategory.MONTH to R.string.month + ) + } + + + fun getAll() : List { + return observeSourcesDao.getAllSources() + } + + fun getByURL(url: String) : ObserveSourcesItem { + return observeSourcesDao.getByURL(url) + } + + fun getByID(id: Long) : ObserveSourcesItem { + return observeSourcesDao.getByID(id) + } + + + suspend fun insert(item: ObserveSourcesItem) : Long{ + if (!observeSourcesDao.checkIfExistsWithSameURL(item.url)){ + return observeSourcesDao.insert(item) + } + return -1 + } + + suspend fun delete(item: ObserveSourcesItem){ + observeSourcesDao.delete(item.id) + } + + + suspend fun deleteAll(){ + observeSourcesDao.deleteAll() + } + + suspend fun update(item: ObserveSourcesItem){ + observeSourcesDao.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/ytdl/database/repository/ResultRepository.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/ResultRepository.kt index 7294969e..be0dead5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ResultRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/ResultRepository.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository import android.content.Context import android.util.Patterns -import com.deniscerri.ytdlnis.database.dao.ResultDao -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.util.InfoUtil +import com.deniscerri.ytdl.database.dao.ResultDao +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.util.InfoUtil import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import java.util.regex.Pattern diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/SearchHistoryRepository.kt b/app/src/main/java/com/deniscerri/ytdl/database/repository/SearchHistoryRepository.kt similarity index 76% rename from app/src/main/java/com/deniscerri/ytdlnis/database/repository/SearchHistoryRepository.kt rename to app/src/main/java/com/deniscerri/ytdl/database/repository/SearchHistoryRepository.kt index 492229f0..defa1f23 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/SearchHistoryRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/repository/SearchHistoryRepository.kt @@ -1,7 +1,7 @@ -package com.deniscerri.ytdlnis.database.repository +package com.deniscerri.ytdl.database.repository -import com.deniscerri.ytdlnis.database.dao.SearchHistoryDao -import com.deniscerri.ytdlnis.database.models.SearchHistoryItem +import com.deniscerri.ytdl.database.dao.SearchHistoryDao +import com.deniscerri.ytdl.database.models.SearchHistoryItem class SearchHistoryRepository(private val searchHistoryDao: SearchHistoryDao) { fun getAll() : List { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CommandTemplateViewModel.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CommandTemplateViewModel.kt index c597d191..7f43d50b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CommandTemplateViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CommandTemplateViewModel.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.app.Application import android.content.ClipboardManager @@ -9,11 +9,11 @@ import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asLiveData 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.TemplateShortcut -import com.deniscerri.ytdlnis.database.repository.CommandTemplateRepository +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.CommandTemplateExport +import com.deniscerri.ytdl.database.models.TemplateShortcut +import com.deniscerri.ytdl.database.repository.CommandTemplateRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt similarity index 91% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt index 0e7c902d..728a0dba 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/CookieViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/CookieViewModel.kt @@ -1,15 +1,11 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel -import android.R.attr.description -import android.R.attr.duration import android.annotation.SuppressLint import android.app.Application import android.content.ClipboardManager -import android.content.ContentValues import android.content.Context import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase.OPEN_READONLY -import android.database.sqlite.SQLiteDatabase.OPEN_READWRITE import android.os.Environment import android.util.Log import android.webkit.CookieManager @@ -17,13 +13,12 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.deniscerri.ytdlnis.BuildConfig -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.Extensions.convertNetscapeToSetCookie -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.BuildConfig +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.database.repository.CookieRepository +import com.deniscerri.ytdl.ui.more.WebViewActivity +import com.deniscerri.ytdl.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.io.File diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/DownloadViewModel.kt similarity index 88% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/DownloadViewModel.kt index 64461768..95f21d7b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/DownloadViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/DownloadViewModel.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.annotation.SuppressLint import android.app.Application @@ -6,6 +6,7 @@ import android.content.SharedPreferences import android.content.res.Configuration import android.content.res.Resources import android.util.DisplayMetrics +import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData @@ -17,27 +18,27 @@ import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -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.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.VideoPreferences -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.repository.HistoryRepository -import com.deniscerri.ytdlnis.database.repository.ResultRepository -import com.deniscerri.ytdlnis.ui.downloadcard.FormatTuple -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.work.AlarmScheduler -import com.deniscerri.ytdlnis.work.UpdatePlaylistFormatsWorker +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.dao.CommandTemplateDao +import com.deniscerri.ytdl.database.dao.DownloadDao +import com.deniscerri.ytdl.database.models.AudioPreferences +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.DownloadItemSimple +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.models.VideoPreferences +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.HistoryRepository +import com.deniscerri.ytdl.database.repository.ResultRepository +import com.deniscerri.ytdl.ui.downloadcard.FormatTuple +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.work.AlarmScheduler +import com.deniscerri.ytdl.work.UpdatePlaylistFormatsWorker import com.google.gson.Gson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -458,28 +459,61 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel } - fun getPreferredAudioRequirements(): MutableList<(Format) -> Boolean> { - val requirements: MutableList<(Format) -> Boolean> = mutableListOf() - requirements.add {it: Format -> audioFormatIDPreference.contains(it.format_id)} + fun getPreferredAudioRequirements(): MutableList<(Format) -> Int> { + val requirements: MutableList<(Format) -> Int> = mutableListOf() + requirements.add {it: Format -> if (audioFormatIDPreference.contains(it.format_id)) 10 else 0} sharedPreferences.getString("audio_language", "")?.apply { if (this.isNotBlank()){ - requirements.add { it: Format -> it.lang?.contains(this) == true } + requirements.add { it: Format -> if (it.lang?.contains(this) == true) 3 else 0 } } } - requirements.add {it: Format -> it.container == audioContainer } - requirements.add {it: Format -> "^(${audioCodec}).+$".toRegex(RegexOption.IGNORE_CASE).matches(it.acodec)} + requirements.add {it: Format -> if ("^(${audioCodec}).+$".toRegex(RegexOption.IGNORE_CASE).matches(it.acodec)) 2 else 0} + requirements.add {it: Format -> if (it.container == audioContainer) 1 else 0 } return requirements } - fun getPreferredVideoRequirements(): MutableList<(Format) -> Boolean> { - val requirements: MutableList<(Format) -> Boolean> = mutableListOf() - requirements.add { it: Format -> formatIDPreference.contains(it.format_id) } - requirements.add { it: Format -> if (videoContainer == "mp4") it.container.equals("mpeg_4", true) else it.container.equals(videoContainer, true)} - requirements.add { it: Format -> it.format_note.contains(videoQualityPreference.split("_")[0].dropLast(1)) } - requirements.add { it: Format -> "^(${videoCodec}).+$".toRegex(RegexOption.IGNORE_CASE).matches(it.vcodec)} - requirements.add { it: Format -> it.acodec == "none" || it.acodec == "" } + //requirement and importance + @SuppressLint("RestrictedApi") + fun getPreferredVideoRequirements(): MutableList<(Format) -> Int> { + val requirements: MutableList<(Format) -> Int> = mutableListOf() + //format id + requirements.add { it: Format -> if (formatIDPreference.contains(it.format_id)) 20 else 0 } + //resolutions + application.getStringArray(R.array.video_formats_values) + .filter { it.contains("_") } + .map{ it.split("_")[0].dropLast(1) + }.toMutableList().apply { + when(videoQualityPreference) { + "worst" -> { + requirements.add { it: Format -> if (it.format_note.contains("worst", ignoreCase = true)) (15) else 0 } + } + "best" -> { + requirements.add { it: Format -> if (it.format_note.contains("best", ignoreCase = true)) (15) else 0 } + } + else -> { + val preferenceIndex = this.indexOfFirst { videoQualityPreference.contains(it) } + val preference = this[preferenceIndex] + for(i in 0..preferenceIndex){ + removeAt(0) + } + add(0, preference) + forEachIndexed { index, res -> + requirements.add { it: Format -> if (it.format_note.contains(res, ignoreCase = true)) (15 - index - 1) else 0 } + } + } + } + + } + requirements.add { it: Format -> if ("^(${videoCodec})(.+)?$".toRegex(RegexOption.IGNORE_CASE).matches(it.vcodec)) 5 else 0 } + requirements.add { it: Format -> if (it.acodec == "none" || it.acodec == "") 1 else 0 } + requirements.add { it: Format -> + if (videoContainer == "mp4") + if (it.container.equals("mpeg_4", true)) 1 else 0 + else + if (it.container.equals(videoContainer, true)) 1 else 0 + } return requirements } @@ -490,7 +524,7 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel try { val theFormats = formats.filter { it.vcodec.isBlank() || it.vcodec == "none" } val requirements = getPreferredAudioRequirements() - theFormats.maxByOrNull { f -> requirements.count{req -> req(f)} } ?: throw Exception() + theFormats.maxByOrNull { f -> requirements.sumOf{ req -> req(f)} } ?: throw Exception() }catch (e: Exception){ bestAudioFormat } @@ -500,14 +534,25 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel Type.video -> { return cloneFormat( try { - val theFormats = formats.filter { it.vcodec.isNotBlank() && it.vcodec != "null" }.ifEmpty { defaultVideoFormats.sortedByDescending { it.filesize } } + val theFormats = formats.filter { it.vcodec.isNotBlank() && it.vcodec != "none" }.ifEmpty { + defaultVideoFormats.sortedByDescending { it.filesize } + } when (videoQualityPreference) { "worst" -> { theFormats.last() } else /*best*/ -> { val requirements = getPreferredVideoRequirements() - theFormats.maxByOrNull { f -> requirements.count{ req -> req(f)} } ?: throw Exception() + theFormats.run { + if (sharedPreferences.getBoolean("prefer_smaller_formats", false)){ + sortedBy { it.filesize }.maxByOrNull { f -> requirements.sumOf { req -> req(f) } } ?: throw Exception() + }else{ + sortedByDescending { it.filesize }.maxByOrNull { f -> + val summ = requirements.sumOf { req -> req(f) } + summ + } ?: throw Exception() + } + } } } }catch (e: Exception){ @@ -828,7 +873,9 @@ class DownloadViewModel(private val application: Application) : AndroidViewModel suspend fun updateProcessingFormat(selectedFormats: List): List { val items = repository.getProcessingDownloads() items.forEachIndexed { index, i -> - i.format = selectedFormats[index].format + selectedFormats[index].format?.apply { + i.format = this + } if (i.type == Type.video) selectedFormats[index].audioFormats?.map { it.format_id }?.let { i.videoPreferences.audioFormatIDs.addAll(it) } repository.update(i) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/HistoryViewModel.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/HistoryViewModel.kt index 8f8a9d7b..df63c93b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/HistoryViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/HistoryViewModel.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.app.Application import androidx.lifecycle.AndroidViewModel @@ -7,11 +7,11 @@ import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.DBManager.SORTING -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.repository.HistoryRepository -import com.deniscerri.ytdlnis.database.repository.HistoryRepository.HistorySortType +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.DBManager.SORTING +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.repository.HistoryRepository +import com.deniscerri.ytdl.database.repository.HistoryRepository.HistorySortType import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt similarity index 84% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt index 02c840c7..e1d7b6aa 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/LogViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/LogViewModel.kt @@ -1,14 +1,14 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.repository.LogRepository +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.LogRepository import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ObserveSourcesViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ObserveSourcesViewModel.kt new file mode 100644 index 00000000..884c2bd3 --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ObserveSourcesViewModel.kt @@ -0,0 +1,147 @@ +package com.deniscerri.ytdl.database.viewmodel + +import android.app.Application +import android.content.SharedPreferences +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.asLiveData +import androidx.lifecycle.viewModelScope +import androidx.preference.PreferenceManager +import androidx.work.Constraints +import androidx.work.Data +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.work.ObserveSourceWorker +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import java.util.Calendar +import java.util.concurrent.TimeUnit + +class ObserveSourcesViewModel(private val application: Application) : AndroidViewModel(application) { + private val repository: ObserveSourcesRepository + val items: LiveData> + private val workManager : WorkManager + private val preferences : SharedPreferences + + init { + val dao = DBManager.getInstance(application).observeSourcesDao + repository = ObserveSourcesRepository(dao) + items = repository.items.asLiveData() + workManager = WorkManager.getInstance(application) + preferences = PreferenceManager.getDefaultSharedPreferences(application) + } + + fun getAll(): List { + return repository.getAll() + } + + fun getByURL(url: String) : ObserveSourcesItem { + return repository.getByURL(url) + } + + fun getByID(id: Long) : ObserveSourcesItem { + return repository.getByID(id) + } + + suspend fun insert(item: ObserveSourcesItem) : Long { + if (item.id > 0) { + repository.update(item) + observeTask(item) + return item.id + } + + val id = repository.insert(item) + item.id = id + if (id > 0) observeTask(item) + return id + } + + fun delete(item: ObserveSourcesItem) = viewModelScope.launch(Dispatchers.IO) { + runCatching { cancelObservationTaskByID(item.id) } + repository.delete(item) + } + + fun deleteAll() = viewModelScope.launch(Dispatchers.IO) { + getAll().forEach { + runCatching { cancelObservationTaskByID(it.id) } + } + + repository.deleteAll() + } + + suspend fun update(item: ObserveSourcesItem) { + repository.update(item) + } + + private fun cancelObservationTaskByID(id: Long){ + workManager.cancelAllWorkByTag(id.toString()) + } + + + + private fun observeTask(it: ObserveSourcesItem){ + cancelObservationTaskByID(it.id) + + Calendar.getInstance().apply { + timeInMillis = it.startsTime + val date = Calendar.getInstance() + set(Calendar.DAY_OF_MONTH, date.get(Calendar.DAY_OF_MONTH)) + set(Calendar.MONTH, date.get(Calendar.MONTH)) + set(Calendar.YEAR, date.get(Calendar.YEAR)) + + if (it.everyCategory != ObserveSourcesRepository.EveryCategory.HOUR){ + val hourMin = Calendar.getInstance() + hourMin.timeInMillis = it.everyTime + set(Calendar.HOUR_OF_DAY, hourMin.get(Calendar.HOUR_OF_DAY)) + set(Calendar.MINUTE, hourMin.get(Calendar.MINUTE)) + } + + when(it.everyCategory){ + ObserveSourcesRepository.EveryCategory.HOUR -> {} + ObserveSourcesRepository.EveryCategory.DAY -> {} + ObserveSourcesRepository.EveryCategory.WEEK -> { + var weekDayNr = get(Calendar.DAY_OF_WEEK) - 1 + if (weekDayNr == 0) weekDayNr = 7 + val followingWeekDay = it.weeklyConfig?.weekDays?.firstOrNull { it >= weekDayNr } + if (followingWeekDay == null){ + add(Calendar.DAY_OF_MONTH, + it.weeklyConfig?.weekDays?.minBy { it }?.plus((7 - weekDayNr)) ?: 0) + }else{ + add(Calendar.DAY_OF_MONTH, followingWeekDay - weekDayNr) + } + } + ObserveSourcesRepository.EveryCategory.MONTH -> { + val currentMonthIndex = get(Calendar.MONTH) + if (it.monthlyConfig?.startsMonth != currentMonthIndex){ + set(Calendar.MONTH, it.monthlyConfig?.startsMonth ?: 0) + if (timeInMillis < Calendar.getInstance().timeInMillis){ + add(Calendar.YEAR, 1) + } + } + } + } + + //schedule for next time + val workConstraints = Constraints.Builder() + val workRequest = OneTimeWorkRequestBuilder() + .addTag("observeSources") + .addTag(it.id.toString()) + .setConstraints(workConstraints.build()) + .setInitialDelay(System.currentTimeMillis() - timeInMillis, TimeUnit.MILLISECONDS) + .setInputData(Data.Builder().putLong("id", it.id).build()) + + workManager.enqueueUniqueWork( + "OBSERVE${it.id}", + ExistingWorkPolicy.REPLACE, + workRequest.build() + ) + } + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ResultViewModel.kt similarity index 81% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ResultViewModel.kt index 6d8d034f..56bd8a90 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ResultViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/ResultViewModel.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.app.ActivityManager import android.app.ActivityManager.RunningAppProcessInfo @@ -10,24 +10,22 @@ import androidx.lifecycle.LiveData import androidx.lifecycle.asLiveData import androidx.lifecycle.viewModelScope import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.dao.DownloadDao -import com.deniscerri.ytdlnis.database.dao.ResultDao -import com.deniscerri.ytdlnis.database.models.Format -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.InfoUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.dao.ResultDao +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.models.SearchHistoryItem +import com.deniscerri.ytdl.database.repository.ResultRepository +import com.deniscerri.ytdl.database.repository.SearchHistoryRepository +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil import com.yausername.youtubedl_android.YoutubeDLException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update -import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import java.util.concurrent.CancellationException @@ -106,36 +104,42 @@ class ResultViewModel(private val application: Application) : AndroidViewModel(a uiState.update {it.copy(processing = false)} } + private suspend fun parseQueriesImpl(inputQueries: List, onResult: (list: List) -> Unit) { + if (inputQueries.size > 1){ + repository.itemCount.value = inputQueries.size + } + val resetResults = inputQueries.size == 1 + + uiState.update {it.copy(processing = true, errorMessage = null, actions = null)} + val res = mutableListOf() + inputQueries.forEach { inputQuery -> + try { + res.addAll(repository.getResultsFromSource(inputQuery, resetResults)) + } catch (e: Exception) { + if (updateResultDataJob?.isCancelled == false || e is YoutubeDLException){ + uiState.update {it.copy( + processing = false, + errorMessage = Pair(R.string.no_results, e.message.toString()), + actions = mutableListOf(Pair(R.string.copy_log, ResultAction.COPY_LOG)) + )} + Log.e(tag, e.toString()) + } + + } + } + if (!isForegrounded() && inputQueries.size > 1){ + notificationUtil.showQueriesFinished() + } + uiState.update {it.copy(processing = false)} + onResult(res) + } + suspend fun parseQueries(inputQueries: List, onResult: (list: List) -> Unit) { if (parsingQueries == null || parsingQueries?.isCancelled == true || parsingQueries?.isCompleted == true) { parsingQueries = viewModelScope.launch(Dispatchers.IO) { - if (inputQueries.size > 1){ - repository.itemCount.value = inputQueries.size + parseQueriesImpl(inputQueries) { + onResult(it) } - val resetResults = inputQueries.size == 1 - - uiState.update {it.copy(processing = true, errorMessage = null, actions = null)} - val res = mutableListOf() - inputQueries.forEach { inputQuery -> - try { - res.addAll(repository.getResultsFromSource(inputQuery, resetResults)) - } catch (e: Exception) { - if (updateResultDataJob?.isCancelled == false || e is YoutubeDLException){ - uiState.update {it.copy( - processing = false, - errorMessage = Pair(R.string.no_results, e.message.toString()), - actions = mutableListOf(Pair(R.string.copy_log, ResultAction.COPY_LOG)) - )} - Log.e(tag, e.toString()) - } - - } - } - if (!isForegrounded() && inputQueries.size > 1){ - notificationUtil.showQueriesFinished() - } - uiState.update {it.copy(processing = false)} - onResult(res) } }else{ onResult(listOf()) @@ -207,7 +211,7 @@ class ResultViewModel(private val application: Application) : AndroidViewModel(a updateResultDataJob = viewModelScope.launch(Dispatchers.IO) { updatingData.emit(true) updatingData.value = true - parseQueries(listOf(res.url)){ result -> + parseQueriesImpl(listOf(res.url)){ result -> viewModelScope.launch(Dispatchers.IO){ updatingData.emit(false) updatingData.value = false @@ -216,7 +220,7 @@ class ResultViewModel(private val application: Application) : AndroidViewModel(a } } - updateResultDataJob?.start() + //updateResultDataJob?.start() updateResultDataJob?.invokeOnCompletion { if (it != null){ viewModelScope.launch(Dispatchers.IO) { @@ -230,7 +234,7 @@ class ResultViewModel(private val application: Application) : AndroidViewModel(a } } - suspend fun cancelUpdateItemData(){ + suspend fun cancelUpdateItemData() = viewModelScope.launch(Dispatchers.IO) { updateResultDataJob?.cancel(CancellationException()) updatingData.emit(false) updatingData.value = false @@ -238,7 +242,7 @@ class ResultViewModel(private val application: Application) : AndroidViewModel(a updateResultData.value = null } - suspend fun cancelUpdateFormatsItemData(){ + suspend fun cancelUpdateFormatsItemData() = viewModelScope.launch(Dispatchers.IO) { updatingFormats.emit(false) updatingFormats.value = false updateFormatsResultData.emit(null) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/TerminalViewModel.kt similarity index 87% rename from app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt rename to app/src/main/java/com/deniscerri/ytdl/database/viewmodel/TerminalViewModel.kt index e2084bee..1f343b4c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/TerminalViewModel.kt +++ b/app/src/main/java/com/deniscerri/ytdl/database/viewmodel/TerminalViewModel.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.database.viewmodel +package com.deniscerri.ytdl.database.viewmodel import android.app.Application import androidx.lifecycle.AndroidViewModel @@ -6,11 +6,11 @@ import androidx.work.Data import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.dao.TerminalDao -import com.deniscerri.ytdlnis.database.models.TerminalItem -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.work.TerminalDownloadWorker +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.dao.TerminalDao +import com.deniscerri.ytdl.database.models.TerminalItem +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.work.TerminalDownloadWorker import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/CancelDownloadNotificationReceiver.kt similarity index 85% rename from app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt rename to app/src/main/java/com/deniscerri/ytdl/receiver/CancelDownloadNotificationReceiver.kt index 1731ff3e..de6e2fc5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelDownloadNotificationReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/CancelDownloadNotificationReceiver.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.receiver +package com.deniscerri.ytdl.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.util.NotificationUtil import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/CancelWorkReceiver.kt similarity index 91% rename from app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt rename to app/src/main/java/com/deniscerri/ytdl/receiver/CancelWorkReceiver.kt index bfc49ae4..023cca88 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/CancelWorkReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/CancelWorkReceiver.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.receiver +package com.deniscerri.ytdl.receiver import android.content.BroadcastReceiver import android.content.Context diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/PauseDownloadNotificationReceiver.kt similarity index 87% rename from app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt rename to app/src/main/java/com/deniscerri/ytdl/receiver/PauseDownloadNotificationReceiver.kt index 5906fa12..f51239a5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/PauseDownloadNotificationReceiver.kt +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/PauseDownloadNotificationReceiver.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.receiver +package com.deniscerri.ytdl.receiver import android.content.BroadcastReceiver import android.content.Context import android.content.Intent -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.util.NotificationUtil import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ResumeActivity.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/ResumeActivity.kt similarity index 91% rename from app/src/main/java/com/deniscerri/ytdlnis/receiver/ResumeActivity.kt rename to app/src/main/java/com/deniscerri/ytdl/receiver/ResumeActivity.kt index d98ed547..6bbffe87 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ResumeActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/ResumeActivity.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.receiver +package com.deniscerri.ytdl.receiver import android.content.Context import android.content.Intent @@ -12,11 +12,11 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowCompat import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.ui.BaseActivity -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.util.ThemeUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.BaseActivity +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.ThemeUtil import com.google.android.material.bottomsheet.BottomSheetDialog import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/ShareActivity.kt similarity index 66% rename from app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt rename to app/src/main/java/com/deniscerri/ytdl/receiver/ShareActivity.kt index f233735d..cfb1598e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/ShareActivity.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.receiver +package com.deniscerri.ytdl.receiver import android.Manifest import android.annotation.SuppressLint @@ -8,6 +8,8 @@ import android.content.Intent import android.content.SharedPreferences import android.content.pm.PackageManager import android.content.res.Configuration +import android.graphics.Color +import android.graphics.PixelFormat import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Build @@ -15,6 +17,8 @@ import android.os.Bundle import android.provider.Settings import android.util.Log import android.util.Patterns +import android.view.LayoutInflater +import android.view.View import android.view.WindowManager import androidx.core.app.ActivityCompat import androidx.core.view.ViewCompat @@ -26,13 +30,13 @@ import androidx.navigation.NavDestination import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.BaseActivity -import com.deniscerri.ytdlnis.util.ThemeUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.CookieViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.BaseActivity +import com.deniscerri.ytdl.util.ThemeUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -43,6 +47,7 @@ import kotlinx.coroutines.withContext import kotlin.properties.Delegates import kotlin.system.exitProcess + class ShareActivity : BaseActivity() { lateinit var context: Context @@ -63,20 +68,51 @@ class ShareActivity : BaseActivity() { v.setPadding(0, 0, 0, 0) insets } - window.run { - setBackgroundDrawable(ColorDrawable(0)) - setLayout( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.MATCH_PARENT + + if (Settings.canDrawOverlays(this)){ + val params = WindowManager.LayoutParams( + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY + } else { + WindowManager.LayoutParams.TYPE_SYSTEM_ALERT + }, + PixelFormat.TRANSLUCENT ) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - } else { - setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) + val wm = getSystemService(WINDOW_SERVICE) as WindowManager + + val inflater = getSystemService(LAYOUT_INFLATER_SERVICE) as LayoutInflater + val myView: View = inflater.inflate(R.layout.activity_share, null) + window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + wm.addView(myView, params) + +// window.addFlags( +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE +// or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL +// or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE +// ) +// +// val params = window.attributes +// params.alpha = 0f +// window.attributes = params +// setContentView(R.layout.activity_share) + + }else{ + window.run { + setBackgroundDrawable(ColorDrawable(0)) + setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) + } else { + setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) + } } + + setContentView(R.layout.activity_share) } - setContentView(R.layout.activity_share) context = baseContext resultViewModel = ViewModelProvider(this)[ResultViewModel::class.java] downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] @@ -175,75 +211,6 @@ class ShareActivity : BaseActivity() { } } } - - private fun askPermissions() { - val permissions = arrayListOf() - if (!checkFilePermission()) { - if (Build.VERSION.SDK_INT >= 33){ - permissions.add(Manifest.permission.READ_MEDIA_AUDIO) - permissions.add(Manifest.permission.READ_MEDIA_VIDEO) - }else{ - permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE) - } - } - if (!checkNotificationPermission()){ - permissions.add(Manifest.permission.POST_NOTIFICATIONS) - } - - if (permissions.isNotEmpty()){ - ActivityCompat.requestPermissions( - this, - permissions.toTypedArray(), - 1 - ) - } - } - - override fun onRequestPermissionsResult( - requestCode: Int, - permissions: Array, - grantResults: IntArray - ) { - super.onRequestPermissionsResult(requestCode, permissions, grantResults) - for (i in permissions.indices) { - if (permissions.contains(Manifest.permission.POST_NOTIFICATIONS)) break - if (grantResults[i] == PackageManager.PERMISSION_DENIED) { - createPermissionRequestDialog() - } - } - } - - private fun exit() { - finishAffinity() - exitProcess(0) - } - - private fun checkFilePermission(): Boolean { - return (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) - == PackageManager.PERMISSION_GRANTED) - } - - private fun checkNotificationPermission(): Boolean { - return (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) - == PackageManager.PERMISSION_GRANTED) - } - - private fun createPermissionRequestDialog() { - val dialog = MaterialAlertDialogBuilder(this) - dialog.setTitle(getString(R.string.warning)) - dialog.setMessage(getString(R.string.request_permission_desc)) - dialog.setOnCancelListener { exit() } - dialog.setNegativeButton(getString(R.string.exit_app)) { _: DialogInterface?, _: Int -> exit() } - dialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> - val intent = Intent( - Settings.ACTION_APPLICATION_DETAILS_SETTINGS, - Uri.fromParts("package", packageName, null) - ) - startActivity(intent) - exitProcess(0) - } - dialog.show() - } override fun onConfigurationChanged(newConfig: Configuration) { startActivity(Intent(this, MainActivity::class.java)) super.onConfigurationChanged(newConfig) diff --git a/app/src/main/java/com/deniscerri/ytdl/receiver/TransparentActivity.kt b/app/src/main/java/com/deniscerri/ytdl/receiver/TransparentActivity.kt new file mode 100644 index 00000000..5179e5b6 --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/receiver/TransparentActivity.kt @@ -0,0 +1,85 @@ +package com.deniscerri.ytdl.receiver + +import android.content.Context +import android.graphics.Color +import android.graphics.PixelFormat +import android.graphics.drawable.ColorDrawable +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.Toast +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.lifecycleScope +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.BaseActivity +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.ThemeUtil +import com.deniscerri.ytdl.util.UiUtil + +class TransparentActivity : BaseActivity() { + + lateinit var context: Context + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + ThemeUtil.updateTheme(this) + WindowCompat.setDecorFitsSystemWindows(window, false) + ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { v, insets -> + v.setPadding(0, 0, 0, 0) + insets + } + if (Settings.canDrawOverlays(this)){ + window.addFlags( + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + or WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + ) + + val params = window.attributes + params.alpha = 0f + window.attributes = params + setContentView(R.layout.activity_share) + + }else{ + window.run { + setBackgroundDrawable(ColorDrawable(0)) + setLayout( + WindowManager.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.MATCH_PARENT + ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) + } else { + setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) + } + } + + setContentView(R.layout.activity_share) + } + + when(intent.getStringExtra("action")){ + "NEW_TEMPLATE" -> newTemplate() + } + } + + private fun newTemplate(){ + val viewmodel = ViewModelProvider(this)[CommandTemplateViewModel::class.java] + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + null, this, this, viewmodel, + newTemplate = { + Toast.makeText(this, R.string.ok,Toast.LENGTH_SHORT).show() + this.finishAffinity() + }, + dismissed = { + this.finishAffinity() + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdl/ui/BaseActivity.kt b/app/src/main/java/com/deniscerri/ytdl/ui/BaseActivity.kt new file mode 100644 index 00000000..6a5f9bcd --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/ui/BaseActivity.kt @@ -0,0 +1,112 @@ +package com.deniscerri.ytdl.ui + +import android.Manifest +import android.content.DialogInterface +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.Settings +import androidx.annotation.RequiresApi +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.ThemeUtil +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.elevation.SurfaceColors +import kotlin.system.exitProcess + +open class BaseActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + ThemeUtil.updateTheme(this) + window.navigationBarColor = SurfaceColors.SURFACE_2.getColor(this) + super.onCreate(savedInstanceState) + } + + fun askPermissions() { + val permissions = arrayListOf() + if (!checkFilePermission()) { + if (Build.VERSION.SDK_INT >= 33){ + permissions.add(Manifest.permission.READ_MEDIA_AUDIO) + permissions.add(Manifest.permission.READ_MEDIA_VIDEO) + if (Build.VERSION.SDK_INT >= 34){ + permissions.add(Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED) + } + }else{ + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE) + permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE) + } + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + if (!checkNotificationPermission()){ + permissions.add(Manifest.permission.POST_NOTIFICATIONS) + } + } + + if (permissions.isNotEmpty()){ + ActivityCompat.requestPermissions( + this, + permissions.toTypedArray(), + 1 + ) + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + for (i in permissions.indices) { + if (permissions.contains(Manifest.permission.POST_NOTIFICATIONS)) continue + if (grantResults[i] == PackageManager.PERMISSION_DENIED) { + createPermissionRequestDialog() + } + } + } + + private fun checkFilePermission(): Boolean { + return if(Build.VERSION.SDK_INT >= 33){ + (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_AUDIO) + == PackageManager.PERMISSION_GRANTED) && + (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_VIDEO) + == PackageManager.PERMISSION_GRANTED) + }else{ + (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED) && + (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) + == PackageManager.PERMISSION_GRANTED) + } + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkNotificationPermission(): Boolean { + return (ActivityCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) + == PackageManager.PERMISSION_GRANTED) + } + + private fun createPermissionRequestDialog() { + val dialog = MaterialAlertDialogBuilder(this) + dialog.setTitle(getString(R.string.warning)) + dialog.setMessage(getString(R.string.request_permission_desc)) + dialog.setOnCancelListener { exit() } + dialog.setNegativeButton(getString(R.string.exit_app)) { _: DialogInterface?, _: Int -> exit() } + dialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> + val intent = Intent( + Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.fromParts("package", packageName, null) + ) + startActivity(intent) + exitProcess(0) + } + dialog.show() + } + + private fun exit() { + finishAffinity() + exitProcess(0) + } + +} \ 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/ytdl/ui/HomeFragment.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/HomeFragment.kt index 77af5037..3c17ee81 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/HomeFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/HomeFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui +package com.deniscerri.ytdl.ui import android.annotation.SuppressLint import android.app.Activity @@ -32,22 +32,20 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.models.SearchSuggestionItem -import com.deniscerri.ytdlnis.database.models.SearchSuggestionType -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.adapter.HomeAdapter -import com.deniscerri.ytdlnis.ui.adapter.SearchSuggestionsAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.ThemeUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.models.SearchSuggestionItem +import com.deniscerri.ytdl.database.models.SearchSuggestionType +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.adapter.HomeAdapter +import com.deniscerri.ytdl.ui.adapter.SearchSuggestionsAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.ThemeUtil +import com.deniscerri.ytdl.util.UiUtil import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar @@ -218,6 +216,12 @@ class HomeFragment : Fragment(), HomeAdapter.OnItemClickListener, SearchSuggesti inputQueries!!.addAll(argList) } + if(arguments?.getBoolean("search") == true){ + requireView().post { + searchBar?.performClick() + } + } + if (inputQueries != null) { lifecycleScope.launch(Dispatchers.IO){ resultViewModel.deleteAll() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadAdapter.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadAdapter.kt index 4545f4df..c647f8c2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadAdapter.kt @@ -1,9 +1,8 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.animation.ValueAnimator import android.app.Activity import android.content.SharedPreferences -import android.graphics.Color import android.os.Handler import android.os.Looper import android.view.LayoutInflater @@ -17,18 +16,17 @@ 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.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.dp -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.dp +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.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.squareup.picasso.Picasso class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadMinifiedAdapter.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadMinifiedAdapter.kt index 814012bd..e270fb75 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ActiveDownloadMinifiedAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ActiveDownloadMinifiedAdapter.kt @@ -1,8 +1,7 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.content.SharedPreferences -import android.graphics.Color import android.os.Handler import android.os.Looper import android.view.LayoutInflater @@ -16,16 +15,15 @@ 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.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup +import com.deniscerri.ytdl.util.FileUtil import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.LinearProgressIndicator -import com.squareup.picasso.Picasso class ActiveDownloadMinifiedAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( DIFF_CALLBACK diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/AlreadyExistsAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/AlreadyExistsAdapter.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/AlreadyExistsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/AlreadyExistsAdapter.kt index 6d8b2165..0fa2593a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/AlreadyExistsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/AlreadyExistsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -10,17 +10,16 @@ import android.view.ViewGroup import android.widget.Button import android.widget.ImageView import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.preference.PreferenceManager 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.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup +import com.deniscerri.ytdl.util.FileUtil import com.google.android.material.card.MaterialCardView class AlreadyExistsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter, AlreadyExistsAdapter.ViewHolder>(AsyncDifferConfig.Builder( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ConfigureMultipleDownloadsAdapter.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/ConfigureMultipleDownloadsAdapter.kt index f94eb730..b7fba551 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ConfigureMultipleDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ConfigureMultipleDownloadsAdapter.kt @@ -1,8 +1,7 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.content.SharedPreferences -import android.graphics.Color import android.os.Handler import android.os.Looper import android.view.LayoutInflater @@ -16,14 +15,13 @@ 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.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup +import com.deniscerri.ytdl.util.FileUtil 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 --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/CookieAdapter.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/CookieAdapter.kt index f44e7d32..49ef709d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/CookieAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/CookieAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.view.LayoutInflater @@ -9,9 +9,9 @@ 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.CookieItem -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.card.MaterialCardView class CookieAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/DownloadLogsAdapter.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/DownloadLogsAdapter.kt index 89be5480..43691f02 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/DownloadLogsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/DownloadLogsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -11,11 +11,11 @@ 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.LogItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.popup -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.popup +import com.deniscerri.ytdl.util.FileUtil import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import java.text.SimpleDateFormat diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/GenericDownloadAdapter.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/GenericDownloadAdapter.kt index 4d0b2366..c3121be1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/GenericDownloadAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/GenericDownloadAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -14,15 +14,14 @@ 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.DownloadItemSimple -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItemSimple +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup +import com.deniscerri.ytdl.util.FileUtil 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 diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/HistoryAdapter.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/HistoryAdapter.kt index bc352d2e..959e0e98 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/HistoryAdapter.kt @@ -1,9 +1,8 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity import android.content.SharedPreferences -import android.graphics.Color import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter import android.os.Handler @@ -19,15 +18,14 @@ 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.HistoryItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.card.MaterialCardView import com.google.android.material.color.MaterialColors import com.google.android.material.floatingactionbutton.FloatingActionButton -import com.squareup.picasso.Picasso import java.io.File import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/HomeAdapter.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/HomeAdapter.kt index 3aeb66bf..e50c7073 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/HomeAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -15,11 +15,11 @@ 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.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.LinearProgressIndicator diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ObserveSourcesAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ObserveSourcesAdapter.kt similarity index 71% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ObserveSourcesAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/ObserveSourcesAdapter.kt index 1325db32..64c823f8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/ObserveSourcesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/ObserveSourcesAdapter.kt @@ -1,24 +1,22 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity -import android.os.Handler -import android.os.Looper import android.text.format.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button -import android.widget.ImageView import android.widget.TextView import androidx.core.view.isVisible 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.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.util.Extensions.calculateNextTime +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.floatingactionbutton.FloatingActionButton @@ -78,34 +76,10 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity: //INFO val info = card.findViewById(R.id.info) - + val nextTime = item.calculateNextTime() val c = Calendar.getInstance() - val hourMin = Calendar.getInstance() - hourMin.timeInMillis = item.everyTime - c.set(Calendar.HOUR_OF_DAY, hourMin.get(Calendar.HOUR_OF_DAY)) - c.set(Calendar.MINUTE, hourMin.get(Calendar.MINUTE)) + c.timeInMillis = nextTime - when(item.everyCategory){ - ObserveSourcesRepository.EveryCategory.DAY -> { - c.add(Calendar.DAY_OF_MONTH, item.everyNr) - } - ObserveSourcesRepository.EveryCategory.WEEK -> { - if(item.everyWeekDay.isEmpty()){ - c.add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) - }else{ - val weekDayID = c.get(Calendar.DAY_OF_WEEK).toString() - val followingWeekDay = (item.everyWeekDay.firstOrNull { it.toInt() > weekDayID.toInt() } ?: item.everyWeekDay.minBy { it.toInt() }).toInt() - c.set(Calendar.DAY_OF_WEEK, followingWeekDay) - if (item.everyNr > 1){ - c.add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) - } - } - } - ObserveSourcesRepository.EveryCategory.MONTH -> { - c.add(Calendar.MONTH, item.everyNr) - c.set(Calendar.DAY_OF_MONTH, item.everyMonthDay) - } - } val weekdays = DateFormatSymbols(Locale.getDefault()).shortWeekdays val text = "${weekdays[c.get(Calendar.DAY_OF_WEEK)]}, ${SimpleDateFormat(DateFormat.getBestDateTimePattern(Locale.getDefault(), "ddMMMyyyy - HHmm"), Locale.getDefault()).format(c.timeInMillis)}" info.text = text @@ -169,12 +143,13 @@ class ObserveSourcesAdapter(onItemClickListener: OnItemClickListener, activity: } override fun areContentsTheSame(oldItem: ObserveSourcesItem, newItem: ObserveSourcesItem): Boolean { - return oldItem.id == newItem.id && - oldItem.name == newItem.name && - oldItem.downloadItemTemplate == newItem.downloadItemTemplate && - oldItem.status == newItem.status && - oldItem.retryMissingDownloads == newItem.retryMissingDownloads && - oldItem.runCount == newItem.runCount + return oldItem.id == newItem.id + && oldItem.name == newItem.name + && oldItem.downloadItemTemplate == newItem.downloadItemTemplate + && oldItem.status == newItem.status + && oldItem.retryMissingDownloads == newItem.retryMissingDownloads + && oldItem.runCount == newItem.runCount + && oldItem.everyCategory == newItem.everyCategory } } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/PlaylistAdapter.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/PlaylistAdapter.kt index 00583fb8..1973b6b5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/PlaylistAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/PlaylistAdapter.kt @@ -1,9 +1,8 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity import android.content.SharedPreferences -import android.graphics.Color import android.os.Handler import android.os.Looper import android.view.LayoutInflater @@ -12,18 +11,16 @@ import android.view.ViewGroup import android.widget.CheckBox import android.widget.ImageView import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.preference.PreferenceManager 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.ResultItem -import com.deniscerri.ytdlnis.util.Extensions.loadThumbnail -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.util.Extensions.loadThumbnail +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.card.MaterialCardView -import com.squareup.picasso.Picasso import java.util.* diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/SearchSuggestionsAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/SearchSuggestionsAdapter.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/SearchSuggestionsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/SearchSuggestionsAdapter.kt index ee21f79f..c3989729 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/SearchSuggestionsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/SearchSuggestionsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -13,9 +13,9 @@ 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.SearchSuggestionItem -import com.deniscerri.ytdlnis.database.models.SearchSuggestionType +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.SearchSuggestionItem +import com.deniscerri.ytdl.database.models.SearchSuggestionType class SearchSuggestionsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt index e9dda6f6..e01faaa5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TemplatesAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TemplatesAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.annotation.SuppressLint import android.app.Activity @@ -11,9 +11,9 @@ 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.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.card.MaterialCardView class TemplatesAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TerminalDownloadsAdapter.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/adapter/TerminalDownloadsAdapter.kt index 63e10c0c..8a0dd13d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/adapter/TerminalDownloadsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/adapter/TerminalDownloadsAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.adapter +package com.deniscerri.ytdl.ui.adapter import android.app.Activity import android.content.SharedPreferences @@ -11,9 +11,9 @@ 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.TerminalItem -import com.deniscerri.ytdlnis.util.Extensions.popup +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.TerminalItem +import com.deniscerri.ytdl.util.Extensions.popup import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.LinearProgressIndicator diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/AddExtraCommandsDialog.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/AddExtraCommandsDialog.kt index f11e478f..f5919dee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/AddExtraCommandsDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/AddExtraCommandsDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -16,18 +16,17 @@ import android.widget.* import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.util.Extensions.enableTextHighlight -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.util.Extensions.enableTextHighlight +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.util.* class AddExtraCommandsDialog(private val item: DownloadItem?, private val callback: ExtraCommandsListener) : BottomSheetDialogFragment() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/BackgroundToForegroundPageTransformer.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/BackgroundToForegroundPageTransformer.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/BackgroundToForegroundPageTransformer.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/BackgroundToForegroundPageTransformer.kt index 1a4fbd98..cab6ab4e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/BackgroundToForegroundPageTransformer.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/BackgroundToForegroundPageTransformer.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.view.View import androidx.viewpager2.widget.ViewPager2 diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt index 2c13db72..bab689c8 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ConfigureDownloadBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -19,14 +19,14 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.snackbar.Snackbar @@ -147,12 +147,16 @@ class ConfigureDownloadBottomSheetDialog(private var result: ResultItem, private val snackTextView = snackbarView.findViewById(com.google.android.material.R.id.snackbar_text) as TextView snackTextView.maxLines = 9999999 s.setAction(R.string.new_template){ - UiUtil.showCommandTemplateCreationOrUpdatingSheet(item = null, context = requireActivity(), lifeCycle = this@ConfigureDownloadBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel){ - commandTemplateNr = 1 - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f - tabLayout.selectTab(tabLayout.getTabAt(2)) - } + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + item = null, context = requireActivity(), lifeCycle = this@ConfigureDownloadBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel, + newTemplate = { + commandTemplateNr = 1 + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f + tabLayout.selectTab(tabLayout.getTabAt(2)) + }, + dismissed = {} + ) } s.show() }else if (tab.position == 1 && isAudioOnly){ diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/CutVideoBottomSheetDialog.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/CutVideoBottomSheetDialog.kt index 430f15ad..1b8119a3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/CutVideoBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/CutVideoBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -25,14 +25,14 @@ import androidx.media3.exoplayer.source.MediaSource import androidx.media3.exoplayer.source.MergingMediaSource import androidx.media3.ui.PlayerView import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.ChapterItem -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.util.Extensions.setTextAndRecalculateWidth -import com.deniscerri.ytdlnis.util.Extensions.toStringDuration -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.util.VideoPlayerUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ChapterItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.util.Extensions.setTextAndRecalculateWidth +import com.deniscerri.ytdl.util.Extensions.toStringDuration +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.util.VideoPlayerUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt index 35fb8236..0ac1a85b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadAudioFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadAudioFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Activity @@ -24,16 +24,16 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.card.MaterialCardView import com.google.android.material.snackbar.Snackbar import com.google.android.material.textfield.TextInputLayout @@ -210,8 +210,10 @@ class DownloadAudioFragment(private var resultItem: ResultItem? = null, private UiUtil.populateFormatCard(requireContext(), formatCard, chosenFormat, null) val listener = object : OnFormatClickListener { override fun onFormatClick(item: List) { - downloadItem.format = item.first().format - UiUtil.populateFormatCard(requireContext(), formatCard, item.first().format, null) + item.first().format?.apply { + downloadItem.format = this + UiUtil.populateFormatCard(requireContext(), formatCard, this, null) + } } override fun onFormatsUpdated(allFormats: List>) { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadBottomSheetDialog.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadBottomSheetDialog.kt index f7081e06..bc4ba75b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadBottomSheetDialog.kt @@ -1,8 +1,7 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog -import android.content.Context import android.content.DialogInterface import android.content.SharedPreferences import android.content.res.Configuration @@ -20,11 +19,9 @@ import android.widget.TextView import android.widget.Toast import androidx.core.content.edit import androidx.core.os.bundleOf -import androidx.core.view.get import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager -import androidx.fragment.app.commitNow import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController @@ -32,18 +29,18 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.receiver.ShareActivity -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.receiver.ShareActivity +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment @@ -155,9 +152,7 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { shimmerLoading.setOnClickListener { lifecycleScope.launch { - withContext(Dispatchers.IO){ - resultViewModel.cancelUpdateItemData() - } + resultViewModel.cancelUpdateItemData() (updateItem.parent as LinearLayout).visibility = View.VISIBLE } } @@ -252,12 +247,18 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { val snackTextView = snackbarView.findViewById(com.google.android.material.R.id.snackbar_text) as TextView snackTextView.maxLines = 9999999 s.setAction(R.string.new_template){ - UiUtil.showCommandTemplateCreationOrUpdatingSheet(item = null, context = requireActivity(), lifeCycle = this@DownloadBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel){ - commandTemplateNr = 1 - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f - tabLayout.selectTab(tabLayout.getTabAt(2)) - } + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + item = null, context = requireActivity(), lifeCycle = this@DownloadBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel, + newTemplate = { + commandTemplateNr = 1 + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f + tabLayout.selectTab(tabLayout.getTabAt(2)) + }, + dismissed = { + + } + ) } s.show() }else if (tab.position == 1 && isAudioOnly){ @@ -305,10 +306,8 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { scheduleBtn.setOnClickListener{ UiUtil.showDatePicker(fragmentManager) { lifecycleScope.launch { - withContext(Dispatchers.IO){ - resultViewModel.cancelUpdateItemData() - resultViewModel.cancelUpdateFormatsItemData() - } + resultViewModel.cancelUpdateItemData() + resultViewModel.cancelUpdateFormatsItemData() } scheduleBtn.isEnabled = false @@ -344,10 +343,8 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { } download!!.setOnClickListener { lifecycleScope.launch { - withContext(Dispatchers.IO){ - resultViewModel.cancelUpdateItemData() - resultViewModel.cancelUpdateFormatsItemData() - } + resultViewModel.cancelUpdateItemData() + resultViewModel.cancelUpdateFormatsItemData() scheduleBtn.isEnabled = false download.isEnabled = false val item: DownloadItem = getDownloadItem() @@ -481,7 +478,7 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { isVisible = true isClickable = true setOnClickListener { - lifecycleScope.launch(Dispatchers.IO) { + lifecycleScope.launch { resultViewModel.cancelUpdateFormatsItemData() } } @@ -493,7 +490,7 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { isVisible = true isClickable = true setOnClickListener { - lifecycleScope.launch(Dispatchers.IO) { + lifecycleScope.launch { resultViewModel.cancelUpdateFormatsItemData() } } @@ -687,7 +684,7 @@ class DownloadBottomSheetDialog : BottomSheetDialogFragment() { } if (resultViewModel.updatingData.value) return - CoroutineScope(SupervisorJob()).launch(Dispatchers.IO) { + lifecycleScope.launch(Dispatchers.IO) { resultViewModel.updateItemData(result) } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadCommandFragment.kt similarity index 81% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadCommandFragment.kt index 6ab94497..f910c82d 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadCommandFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadCommandFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Activity @@ -23,17 +23,17 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.enableTextHighlight -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.util.UiUtil.populateCommandCard +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.enableTextHighlight +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.util.UiUtil.populateCommandCard import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.textfield.TextInputLayout @@ -218,24 +218,28 @@ class DownloadCommandFragment(private val resultItem: ResultItem? = null, privat if (downloadItem.url.isEmpty()) 0 else 1, shortcutCount, newTemplateClicked = { - UiUtil.showCommandTemplateCreationOrUpdatingSheet(null, requireActivity(), viewLifecycleOwner, commandTemplateViewModel) { - templates.add(it) - chosenCommandView.editText!!.setText(it.content) - downloadItem.format = Format( - it.title, - "", - "", - "", - "", - 0, - it.content - ) - preferences.edit().putString("lastCommandTemplateUsed", it.content).apply() - commandTemplateCard.visibility = View.VISIBLE - view.findViewById(R.id.command_txt).visibility = View.VISIBLE - view.findViewById(R.id.editSelected).isEnabled = true - populateCommandCard(commandTemplateCard, it) - } + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + null, requireActivity(), viewLifecycleOwner, commandTemplateViewModel, + newTemplate = { + templates.add(it) + chosenCommandView.editText!!.setText(it.content) + downloadItem.format = Format( + it.title, + "", + "", + "", + "", + 0, + it.content + ) + preferences.edit().putString("lastCommandTemplateUsed", it.content).apply() + commandTemplateCard.visibility = View.VISIBLE + view.findViewById(R.id.command_txt).visibility = View.VISIBLE + view.findViewById(R.id.editSelected).isEnabled = true + populateCommandCard(commandTemplateCard, it) + }, + dismissed = {} + ) }, editSelectedClicked = { @@ -247,21 +251,25 @@ class DownloadCommandFragment(private val resultItem: ResultItem? = null, privat chosenCommandView.editText!!.text.toString(), useAsExtraCommand = false, useAsExtraCommandAudio = false, useAsExtraCommandVideo = false ) - UiUtil.showCommandTemplateCreationOrUpdatingSheet(current, requireActivity(), viewLifecycleOwner, commandTemplateViewModel) { - templates.add(it) - chosenCommandView.editText!!.setText(it.content) - populateCommandCard(commandTemplateCard, it) - downloadItem.format = Format( - it.title, - "", - "", - "", - "", - 0, - it.content - ) - preferences.edit().putString("lastCommandTemplateUsed", it.content).apply() - } + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + current, requireActivity(), viewLifecycleOwner, commandTemplateViewModel, + newTemplate = { + templates.add(it) + chosenCommandView.editText!!.setText(it.content) + populateCommandCard(commandTemplateCard, it) + downloadItem.format = Format( + it.title, + "", + "", + "", + "", + 0, + it.content + ) + preferences.edit().putString("lastCommandTemplateUsed", it.content).apply() + }, + dismissed = {} + ) }, shortcutClicked = { UiUtil.showShortcuts(requireActivity(), commandTemplateViewModel, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadFragmentAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadFragmentAdapter.kt similarity index 87% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadFragmentAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadFragmentAdapter.kt index b4229ea2..7955bf89 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadFragmentAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadFragmentAdapter.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.Lifecycle import androidx.viewpager2.adapter.FragmentStateAdapter -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.ResultItem class DownloadFragmentAdapter ( fragmentManager : FragmentManager, diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt index 9212b045..ea9ec9bf 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadMultipleBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Activity @@ -9,7 +9,6 @@ import android.content.SharedPreferences import android.content.res.Configuration import android.graphics.Canvas import android.graphics.Color -import android.os.Build import android.os.Bundle import android.text.format.DateFormat import android.util.DisplayMetrics @@ -30,19 +29,18 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.adapter.ConfigureMultipleDownloadsAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.adapter.ConfigureMultipleDownloadsAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt index ff19f888..4894c1ea 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/DownloadVideoFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/DownloadVideoFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Activity @@ -24,16 +24,16 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.card.MaterialCardView import com.google.android.material.snackbar.Snackbar import com.google.android.material.textfield.TextInputLayout @@ -221,12 +221,14 @@ class DownloadVideoFragment(private var resultItem: ResultItem? = null, private UiUtil.populateFormatCard(requireContext(), formatCard, chosenFormat, downloadItem.allFormats.filter { downloadItem.videoPreferences.audioFormatIDs.contains(it.format_id) }) val listener = object : OnFormatClickListener { override fun onFormatClick(item: List) { - downloadItem.format = item.first().format + item.first().format?.apply { + downloadItem.format = this + } downloadItem.videoPreferences.audioFormatIDs.clear() item.first().audioFormats?.map { it.format_id }?.let { downloadItem.videoPreferences.audioFormatIDs.addAll(it) } - UiUtil.populateFormatCard(requireContext(), formatCard, item.first().format, + UiUtil.populateFormatCard(requireContext(), formatCard, downloadItem.format, if(downloadItem.videoPreferences.removeAudio) listOf() else item.first().audioFormats ) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/FormatSelectionBottomSheetDialog.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/FormatSelectionBottomSheetDialog.kt index 306eb39c..aa152611 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/FormatSelectionBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/FormatSelectionBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -15,15 +15,14 @@ import androidx.core.view.isVisible import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager -import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.facebook.shimmer.ShimmerFrameLayout import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog @@ -35,7 +34,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import java.util.* class FormatSelectionBottomSheetDialog(private val items: List, private var formats: List>, private val listener: OnFormatClickListener) : BottomSheetDialogFragment() { @@ -269,10 +267,6 @@ class FormatSelectionBottomSheetDialog(private val items: List, p } okBtn.setOnClickListener { - if (selectedVideo == null) { - selectedVideo = - chosenFormats.filter { it.vcodec.isNotBlank() && it.vcodec != "none" }.maxByOrNull { it.filesize }!! - } returnFormats() dismiss() } @@ -349,16 +343,16 @@ class FormatSelectionBottomSheetDialog(private val items: List, p private fun returnFormats(){ //simple video format selection if (items.size == 1){ - listener.onFormatClick(listOf(FormatTuple(selectedVideo!!, selectedAudios.ifEmpty { listOf(downloadViewModel.getFormat(chosenFormats, Type.audio)) }))) + listener.onFormatClick(listOf(FormatTuple(selectedVideo, selectedAudios.ifEmpty { listOf(downloadViewModel.getFormat(chosenFormats, Type.audio)) }))) }else{ //playlist format selection - val selectedFormats = mutableListOf() + val selectedFormats = mutableListOf() formatCollection.forEach { - selectedFormats.add(it.first{ f -> f.format_id == selectedVideo!!.format_id}) + selectedFormats.add(it.first{ f -> f.format_id == selectedVideo?.format_id}) } if (selectedFormats.isEmpty()) { items.forEach { _ -> - selectedFormats.add(selectedVideo!!) + selectedFormats.add(selectedVideo) } } listener.onFormatClick(selectedFormats.map { FormatTuple(it, selectedAudios) }) @@ -389,15 +383,15 @@ class FormatSelectionBottomSheetDialog(private val items: List, p finalFormats = if (items.first()?.type == Type.audio){ val req = downloadViewModel.getPreferredAudioRequirements() finalFormats - .filter { f -> req.count{req -> req(f)} >= 1 } - .sortedByDescending { f -> req.count{req -> req(f)} } + .filter { f -> req.sumOf{req -> req(f)} >= 1 } + .sortedByDescending { f -> req.sumOf{req -> req(f)} } .ifEmpty { listOf(downloadViewModel.getFormat(finalFormats, Type.audio)) } }else{ val req = downloadViewModel.getPreferredVideoRequirements() req.addAll(downloadViewModel.getPreferredAudioRequirements()) finalFormats - .filter { f -> req.count{req -> req(f)} >= 1 } - .sortedByDescending { f -> req.count{req -> req(f)} } + .filter { f -> req.sumOf { req -> req(f) } >= 1 } + .sortedByDescending { f -> req.sumOf { req -> req(f) } } .ifEmpty { listOf(downloadViewModel.getFormat(finalFormats, Type.video)) } } } @@ -577,6 +571,6 @@ interface OnFormatClickListener{ } class FormatTuple internal constructor( - var format: Format, + var format: Format?, var audioFormats: List? ) \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/GUISync.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/GUISync.kt similarity index 50% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/GUISync.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/GUISync.kt index 811871bd..e7168563 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/GUISync.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/GUISync.kt @@ -1,6 +1,6 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard -import com.deniscerri.ytdlnis.database.models.ResultItem +import com.deniscerri.ytdl.database.models.ResultItem interface GUISync { fun updateTitleAuthor(t: String, a: String) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt similarity index 81% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt index ee3933a6..9178cb17 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ObserveSourcesBottomSheetDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -14,7 +14,6 @@ import android.view.View import android.view.ViewGroup import android.widget.ArrayAdapter import android.widget.AutoCompleteTextView -import android.widget.LinearLayout import android.widget.RadioButton import android.widget.TextView import androidx.appcompat.app.AppCompatActivity @@ -28,19 +27,21 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ObserveSourcesViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesMonthlyConfig +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesWeeklyConfig +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel.Type +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ObserveSourcesViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton @@ -122,7 +123,7 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { arguments?.putSerializable("type", downloadItem.type) } - @SuppressLint("RestrictedApi", "InflateParams") + @SuppressLint("RestrictedApi", "InflateParams", "SetTextI18n") override fun setupDialog(dialog: Dialog, style: Int) { super.setupDialog(dialog, style) view = LayoutInflater.from(context).inflate(R.layout.observe_sources_bottom_sheet, null) @@ -201,12 +202,16 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { val snackTextView = snackbarView.findViewById(com.google.android.material.R.id.snackbar_text) as TextView snackTextView.maxLines = 9999999 s.setAction(R.string.new_template){ - UiUtil.showCommandTemplateCreationOrUpdatingSheet(item = null, context = requireActivity(), lifeCycle = this@ObserveSourcesBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel){ - commandTemplateNr = 1 - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true - (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f - tabLayout.selectTab(tabLayout.getTabAt(2)) - } + UiUtil.showCommandTemplateCreationOrUpdatingSheet( + item = null, context = requireActivity(), lifeCycle = this@ObserveSourcesBottomSheetDialog, commandTemplateViewModel = commandTemplateViewModel, + newTemplate = { + commandTemplateNr = 1 + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.isClickable = true + (tabLayout.getChildAt(0) as? ViewGroup)?.getChildAt(2)?.alpha = 1f + tabLayout.selectTab(tabLayout.getTabAt(2)) + }, + dismissed = {} + ) } s.show() } @@ -286,8 +291,9 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { val cats = ObserveSourcesRepository.everyCategoryName.map { getString(it.value) } val adapter = ArrayAdapter(requireActivity(),android.R.layout.simple_dropdown_item_1line, cats) everyCat.doAfterTextChanged { - weekDays.isVisible = it.toString() == cats[1] - startMonth.isVisible = it.toString() == cats[2] + everyTime.isVisible = it.toString() != cats[0] + weekDays.isVisible = it.toString() == cats[2] + startMonth.isVisible = it.toString() == cats[3] startTime.isVisible = !startMonth.isVisible everyMonthDay.isVisible = startMonth.isVisible } @@ -327,29 +333,34 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { calendar.set(Calendar.DAY_OF_MONTH, 1) // Set the day of the month calendar.firstDayOfWeek = Calendar.MONDAY + //weekly config + val daysOfWeek = mutableListOf() - val daysOfWeekTags = mutableListOf() for (i in 0..6) { val dayName = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault())!! daysOfWeek.add(dayName.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }) - daysOfWeekTags.add(calendar.get(Calendar.DAY_OF_WEEK).toString()) calendar.add(Calendar.DAY_OF_WEEK, 1) } weekDays.children.forEachIndexed { index, view -> - (view as Chip).text = daysOfWeek[index] - (view as Chip).tag = daysOfWeekTags[index] + (view as Chip).apply { + text = daysOfWeek[index] + tag = index + 1 + } } if (currentItem != null){ weekDays.children.forEach { view -> - (view as Chip).isChecked = currentItem!!.everyWeekDay.contains(view.tag.toString()) + (view as Chip).isChecked = + currentItem!!.weeklyConfig?.weekDays?.contains(view.tag.toString().toInt()) == true } } + //monthly config + val everyMonthDayAutoCompleteTextView = view.findViewById(R.id.everyMonthDay) everyMonthDayAutoCompleteTextView.setText( - currentItem?.everyMonthDay?.toString() ?: Calendar.getInstance().get(Calendar.DAY_OF_MONTH).toString() + currentItem?.monthlyConfig?.everyMonthDay?.toString() ?: Calendar.getInstance().get(Calendar.DAY_OF_MONTH).toString() , false) val months = mutableListOf() @@ -363,8 +374,14 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { if (currentItem == null){ startMonthAutoCompleteTextView.setText(months.first(), false) }else{ - calendar.set(Calendar.MONTH, Month.values().indexOf(currentItem!!.startsMonth)) - startMonthAutoCompleteTextView.setText(calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault())!!.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }, false) + currentItem?.monthlyConfig?.apply { + calendar.set(Calendar.MONTH, this.startsMonth) + } + startMonthAutoCompleteTextView.setText( + calendar.getDisplayName(Calendar.MONTH, + Calendar.LONG, + Locale.getDefault())!!.replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }, false + ) } startTime.apply { @@ -455,7 +472,6 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { lifecycleScope.launch { val item: DownloadItem = getDownloadItem() - var ends = 0L if(endsOn.isChecked){ ends = endsOnTime.tag as Long @@ -466,26 +482,45 @@ class ObserveSourcesBottomSheetDialog : BottomSheetDialogFragment() { endsAfterCount = endsAfterNr.editText!!.text.toString().toInt() } + val category = ObserveSourcesRepository.EveryCategory.values()[adapter.getPosition(everyCat.text.toString())] + val observeItem = ObserveSourcesItem( - currentItem?.id ?: 0, - title.editText!!.text.toString(), - url.editText!!.text.toString(), - item, - ObserveSourcesRepository.SourceStatus.ACTIVE, - everyNr.editText!!.text.toString().toInt(), - ObserveSourcesRepository.EveryCategory.values()[adapter.getPosition(everyCat.text.toString())], - weekDays.children.filter { (it as Chip).isChecked }.map { it.tag.toString() }.toList(), - everyMonthDay.editText!!.text.toString().toInt(), - everyTime.tag as Long, - startTime.tag as Long, - Month.values()[startMonthAutoCompleteTextView.selectionStart], - ends, - endsAfterCount, - 0, - getOnlyNewUploads.isChecked, - retryMissingDownloads.isChecked, - if (resetProcessedLinks.isChecked) mutableListOf() else currentItem?.alreadyProcessedLinks ?: mutableListOf() + id = currentItem?.id ?: 0, + name = title.editText!!.text.toString(), + url = url.editText!!.text.toString(), + downloadItemTemplate = item, + everyNr = everyNr.editText!!.text.toString().toInt(), + everyCategory = category, + everyTime = everyTime.tag as Long, + weeklyConfig = if (category == ObserveSourcesRepository.EveryCategory.WEEK) { + ObserveSourcesWeeklyConfig( + weekDays = weekDays.children.filter { (it as Chip).isChecked }.map { it.tag.toString().toInt() }.toList() + ) + }else { + null + }, + monthlyConfig = if (category == ObserveSourcesRepository.EveryCategory.MONTH){ + ObserveSourcesMonthlyConfig( + everyMonthDay = everyMonthDay.editText!!.text.toString().toInt(), + startsMonth = startMonthAutoCompleteTextView.selectionStart + ) + }else{ + null + }, + status = ObserveSourcesRepository.SourceStatus.ACTIVE, + startsTime = startTime.tag as Long, + endsDate = ends, + endsAfterCount = endsAfterCount, + runCount = 0, + getOnlyNewUploads = getOnlyNewUploads.isChecked, + retryMissingDownloads = retryMissingDownloads.isChecked, + alreadyProcessedLinks = if (resetProcessedLinks.isChecked){ + mutableListOf() + }else{ + currentItem?.alreadyProcessedLinks ?: mutableListOf() + } ) + withContext(Dispatchers.IO){ observeSourcesViewModel.insert(observeItem) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ResultCardDetailsDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ResultCardDetailsDialog.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ResultCardDetailsDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ResultCardDetailsDialog.kt index 3a20e7e1..fb843af0 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/ResultCardDetailsDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/ResultCardDetailsDialog.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint import android.app.Dialog @@ -38,20 +38,20 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import androidx.work.WorkManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.adapter.ActiveDownloadAdapter -import com.deniscerri.ytdlnis.ui.adapter.ActiveDownloadMinifiedAdapter -import com.deniscerri.ytdlnis.ui.adapter.GenericDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.setFullScreen -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.util.VideoPlayerUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.adapter.ActiveDownloadAdapter +import com.deniscerri.ytdl.ui.adapter.ActiveDownloadMinifiedAdapter +import com.deniscerri.ytdl.ui.adapter.GenericDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.setFullScreen +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.util.VideoPlayerUtil import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsDialog.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/SelectPlaylistItemsDialog.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsDialog.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/SelectPlaylistItemsDialog.kt index bc40b726..32e9f02f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloadcard/SelectPlaylistItemsDialog.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloadcard/SelectPlaylistItemsDialog.kt @@ -1,7 +1,6 @@ -package com.deniscerri.ytdlnis.ui.downloadcard +package com.deniscerri.ytdl.ui.downloadcard import android.annotation.SuppressLint -import android.app.ActionBar.LayoutParams import android.app.Dialog import android.content.res.Configuration import android.os.Build @@ -10,35 +9,28 @@ import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.MenuItem import android.view.View -import android.view.ViewGroup -import android.view.Window import android.widget.TextView import androidx.core.os.bundleOf -import androidx.core.view.children import androidx.core.widget.doAfterTextChanged -import androidx.fragment.app.DialogFragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.adapter.PlaylistAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.setTextAndRecalculateWidth -import com.google.android.material.appbar.MaterialToolbar +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.adapter.PlaylistAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.setTextAndRecalculateWidth import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.google.android.material.button.MaterialButton -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.textfield.TextInputLayout -import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/ActiveDownloadsFragment.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/ActiveDownloadsFragment.kt index a628e61d..3c489ba6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ActiveDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/ActiveDownloadsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.app.Activity import android.os.Bundle @@ -17,13 +17,13 @@ import androidx.recyclerview.widget.RecyclerView import androidx.work.WorkInfo import androidx.work.WorkManager import androidx.work.WorkQuery -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.ui.adapter.ActiveDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.adapter.ActiveDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.util.NotificationUtil import com.google.android.material.button.MaterialButton import com.google.android.material.progressindicator.LinearProgressIndicator import com.yausername.youtubedl_android.YoutubeDL diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/CancelledDownloadsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/CancelledDownloadsFragment.kt index 20ee5d16..68d60add 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/CancelledDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/CancelledDownloadsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.annotation.SuppressLint import android.app.Activity @@ -17,7 +17,6 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.view.ActionMode import androidx.core.os.bundleOf -import androidx.core.view.children import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope @@ -27,15 +26,15 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -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.ui.adapter.GenericDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.adapter.GenericDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.util.Extensions.toListString +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadListFragmentAdapter.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadListFragmentAdapter.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadListFragmentAdapter.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadListFragmentAdapter.kt index 65c68494..58b0b680 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadListFragmentAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadListFragmentAdapter.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueMainFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadQueueMainFragment.kt similarity index 94% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueMainFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadQueueMainFragment.kt index 4ba9af7e..27e4dcb4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/DownloadQueueMainFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/DownloadQueueMainFragment.kt @@ -1,8 +1,7 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.content.DialogInterface import android.content.SharedPreferences -import android.icu.text.Transliterator.Position import android.os.Bundle import android.view.LayoutInflater import android.view.MenuItem @@ -16,15 +15,14 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import androidx.work.WorkManager -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.createBadge -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.createBadge +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.appbar.MaterialToolbar -import com.google.android.material.badge.BadgeDrawable import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/ErroredDownloadsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/ErroredDownloadsFragment.kt index 065d255e..b52005f1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/ErroredDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/ErroredDownloadsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.annotation.SuppressLint import android.app.Activity @@ -27,15 +27,15 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -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.ui.adapter.GenericDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.adapter.GenericDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.util.Extensions.toListString +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/HistoryFragment.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/HistoryFragment.kt index 6ad825fe..a7129159 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/HistoryFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/HistoryFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.annotation.SuppressLint import android.app.Activity @@ -39,16 +39,16 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager.SORTING -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.repository.HistoryRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.ui.adapter.HistoryAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager.SORTING +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.repository.HistoryRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.ui.adapter.HistoryAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomsheet.BottomSheetDialog diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/QueuedDownloadsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/QueuedDownloadsFragment.kt index f5fb4779..df1a9d16 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/QueuedDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/QueuedDownloadsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.annotation.SuppressLint import android.app.Activity @@ -27,17 +27,17 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import androidx.work.WorkManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -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.ui.adapter.GenericDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.adapter.GenericDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.util.Extensions.toListString +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/SavedDownloadsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/SavedDownloadsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/SavedDownloadsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/downloads/SavedDownloadsFragment.kt index 5197f076..d1fbaed2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/downloads/SavedDownloadsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/downloads/SavedDownloadsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.downloads +package com.deniscerri.ytdl.ui.downloads import android.annotation.SuppressLint import android.app.Activity @@ -26,15 +26,15 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -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.ui.adapter.GenericDownloadAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode -import com.deniscerri.ytdlnis.util.Extensions.toListString -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.adapter.GenericDownloadAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.util.Extensions.toListString +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.color.MaterialColors import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/CommandTemplatesFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/CommandTemplatesFragment.kt index a1cf9c87..1b73f940 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CommandTemplatesFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/CommandTemplatesFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more +package com.deniscerri.ytdl.ui.more import android.annotation.SuppressLint import android.content.ClipboardManager @@ -31,15 +31,15 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager.SORTING -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.CommandTemplateExport -import com.deniscerri.ytdlnis.database.repository.CommandTemplateRepository.CommandTemplateSortType -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.ui.adapter.TemplatesAdapter -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager.SORTING +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.CommandTemplateExport +import com.deniscerri.ytdl.database.repository.CommandTemplateRepository.CommandTemplateSortType +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.ui.adapter.TemplatesAdapter +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomsheet.BottomSheetDialog @@ -235,7 +235,7 @@ class CommandTemplatesFragment : Fragment(), TemplatesAdapter.OnItemClickListene val new = view?.findViewById(R.id.newTemplate) new?.setOnClickListener { - UiUtil.showCommandTemplateCreationOrUpdatingSheet(null,mainActivity, this, commandTemplateViewModel) {} + UiUtil.showCommandTemplateCreationOrUpdatingSheet(null,mainActivity, this, commandTemplateViewModel, {}, {}) } val shortcuts = view?.findViewById(R.id.shortcuts) shortcuts?.setOnClickListener { @@ -265,9 +265,9 @@ class CommandTemplatesFragment : Fragment(), TemplatesAdapter.OnItemClickListene } override fun onItemClick(commandTemplate: CommandTemplate, index: Int) { - UiUtil.showCommandTemplateCreationOrUpdatingSheet(commandTemplate,mainActivity, this, commandTemplateViewModel) { + UiUtil.showCommandTemplateCreationOrUpdatingSheet(commandTemplate,mainActivity, this, commandTemplateViewModel, newTemplate = { templatesAdapter.notifyItemChanged(index) - } + }, {}) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/CookiesFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/CookiesFragment.kt index 912196c8..1798b185 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/CookiesFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/CookiesFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more +package com.deniscerri.ytdl.ui.more import android.annotation.SuppressLint import android.content.Context.INPUT_METHOD_SERVICE @@ -25,13 +25,13 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.CookieItem -import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel -import com.deniscerri.ytdlnis.ui.adapter.CookieAdapter -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.database.viewmodel.CookieViewModel +import com.deniscerri.ytdl.ui.adapter.CookieAdapter +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip import com.google.android.material.dialog.MaterialAlertDialogBuilder diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/MoreFragment.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/MoreFragment.kt index ace5fa30..c54d2ed4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/MoreFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/MoreFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more +package com.deniscerri.ytdl.ui.more import android.content.DialogInterface import android.content.Intent @@ -14,12 +14,12 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity -import com.deniscerri.ytdlnis.ui.more.terminal.TerminalActivity +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.more.settings.SettingsActivity +import com.deniscerri.ytdl.ui.more.terminal.TerminalActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/ObserveSourcesFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/ObserveSourcesFragment.kt similarity index 80% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/ObserveSourcesFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/ObserveSourcesFragment.kt index 4d23c5be..92ecf20c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/ObserveSourcesFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/ObserveSourcesFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more +package com.deniscerri.ytdl.ui.more import android.annotation.SuppressLint import android.content.DialogInterface @@ -10,35 +10,35 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.RelativeLayout -import android.widget.TextView import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager -import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import androidx.work.WorkInfo +import androidx.work.Constraints +import androidx.work.Data +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkManager -import androidx.work.WorkQuery -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ObserveSourcesViewModel -import com.deniscerri.ytdlnis.receiver.ObserveAlarmReceiver -import com.deniscerri.ytdlnis.ui.adapter.ObserveSourcesAdapter -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.ObserveSourcesViewModel +import com.deniscerri.ytdl.ui.adapter.ObserveSourcesAdapter +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.work.ObserveSourceWorker import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.chip.Chip import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.google.android.material.progressindicator.LinearProgressIndicator import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import java.util.concurrent.TimeUnit class ObserveSourcesFragment : Fragment(), ObserveSourcesAdapter.OnItemClickListener { @@ -130,10 +130,19 @@ class ObserveSourcesFragment : Fragment(), ObserveSourcesAdapter.OnItemClickList } override fun onItemSearch(item: ObserveSourcesItem) { runCatching { - observeSourcesViewModel.cancelObservationTaskByID(item.id) - val intent = Intent(context, ObserveAlarmReceiver::class.java) - intent.putExtra("id", item.id) - requireActivity().sendBroadcast(intent) + val workConstraints = Constraints.Builder() + val workRequest = OneTimeWorkRequestBuilder() + .addTag("observeSources") + .addTag(item.id.toString()) + .setConstraints(workConstraints.build()) + .setInitialDelay(1000L, TimeUnit.MILLISECONDS) + .setInputData(Data.Builder().putLong("id", item.id).build()) + + WorkManager.getInstance(requireContext()).enqueueUniqueWork( + "OBSERVE${item.id}", + ExistingWorkPolicy.REPLACE, + workRequest.build() + ) }.onFailure { Snackbar.make(requireView(), it.message.toString(), Snackbar.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt index fa99ff5b..e70f1f38 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/WebViewActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/WebViewActivity.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more +package com.deniscerri.ytdl.ui.more import android.annotation.SuppressLint import android.content.SharedPreferences @@ -16,11 +16,10 @@ import androidx.compose.ui.platform.ComposeView import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.CookieItem -import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel -import com.deniscerri.ytdlnis.ui.BaseActivity -import com.deniscerri.ytdlnis.util.Extensions.convertNetscapeToSetCookie +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.database.viewmodel.CookieViewModel +import com.deniscerri.ytdl.ui.BaseActivity import com.google.accompanist.web.AccompanistWebChromeClient import com.google.accompanist.web.AccompanistWebViewClient import com.google.accompanist.web.WebView diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt index d6c1547a..1f8c45ee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.downloadLogs +package com.deniscerri.ytdl.ui.more.downloadLogs import android.annotation.SuppressLint import android.app.ActionBar @@ -21,11 +21,11 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.viewmodel.LogViewModel -import com.deniscerri.ytdlnis.util.Extensions.enableTextHighlight -import com.deniscerri.ytdlnis.util.Extensions.setCustomTextSize +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.LogViewModel +import com.deniscerri.ytdl.util.Extensions.enableTextHighlight +import com.deniscerri.ytdl.util.Extensions.setCustomTextSize import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogListFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogListFragment.kt index 82eba11b..0de218e4 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/downloadLogs/DownloadLogListFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/downloadLogs/DownloadLogListFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.downloadLogs +package com.deniscerri.ytdl.ui.more.downloadLogs import android.content.DialogInterface import android.graphics.Canvas @@ -21,13 +21,13 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.viewmodel.LogViewModel -import com.deniscerri.ytdlnis.ui.adapter.DownloadLogsAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.forceFastScrollMode +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.viewmodel.LogViewModel +import com.deniscerri.ytdl.ui.adapter.DownloadLogsAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.forceFastScrollMode import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/BaseSettingsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/BaseSettingsFragment.kt index 1bf466df..3b2b3823 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/BaseSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/BaseSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity @@ -7,8 +7,8 @@ import androidx.preference.ListPreference import androidx.preference.MultiSelectListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.databinding.TextinputBinding +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.databinding.TextinputBinding import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.textfield.TextInputLayout diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/DownloadSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/DownloadSettingsFragment.kt similarity index 75% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/DownloadSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/DownloadSettingsFragment.kt index bc112254..fb945621 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/DownloadSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/DownloadSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.content.Intent import android.os.Bundle @@ -6,11 +6,16 @@ import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceManager import androidx.preference.SwitchPreferenceCompat -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.receiver.downloadAlarmReceivers.AlarmStartReceiver -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.work.AlarmScheduler +import androidx.work.Constraints +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.work.AlarmScheduler +import com.deniscerri.ytdl.work.DownloadWorker import java.util.Calendar +import java.util.concurrent.TimeUnit class DownloadSettingsFragment : BaseSettingsFragment() { @@ -41,8 +46,17 @@ class DownloadSettingsFragment : BaseSettingsFragment() { }else{ scheduler.cancel() //start worker if there are leftover downloads waiting for scheduler - val intent = Intent(context, AlarmStartReceiver::class.java) - requireActivity().sendBroadcast(intent) + val workConstraints = Constraints.Builder() + val workRequest = OneTimeWorkRequestBuilder() + .addTag("download") + .setConstraints(workConstraints.build()) + .setInitialDelay(1000L, TimeUnit.MILLISECONDS) + + WorkManager.getInstance(requireContext()).enqueueUniqueWork( + System.currentTimeMillis().toString(), + ExistingWorkPolicy.REPLACE, + workRequest.build() + ) } true } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/FolderSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/FolderSettingsFragment.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/FolderSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/FolderSettingsFragment.kt index 01c74807..7bd52900 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/FolderSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/FolderSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.app.Activity import android.content.Intent @@ -16,10 +16,10 @@ import androidx.work.ExistingWorkPolicy import androidx.work.OneTimeWorkRequestBuilder import androidx.work.WorkInfo import androidx.work.WorkManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.work.MoveCacheFilesWorker +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.work.MoveCacheFilesWorker import com.google.android.material.snackbar.Snackbar import java.io.File diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/GeneralSettingsFragment.kt similarity index 82% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/GeneralSettingsFragment.kt index aa8cd069..10f68ca2 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/GeneralSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/GeneralSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.content.ComponentName import android.content.Context @@ -8,18 +8,20 @@ import android.net.Uri import android.os.Bundle import android.os.PowerManager import android.provider.Settings +import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat +import androidx.navigation.fragment.findNavController import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.SwitchPreferenceCompat import androidx.work.WorkInfo import androidx.work.WorkManager -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.util.ThemeUtil -import com.deniscerri.ytdlnis.util.UpdateUtil +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.ThemeUtil +import com.deniscerri.ytdl.util.UpdateUtil import java.util.Locale @@ -33,6 +35,7 @@ class GeneralSettingsFragment : BaseSettingsFragment() { private var locale: ListPreference? = null private var showTerminalShareIcon: SwitchPreferenceCompat? = null private var ignoreBatteryOptimization: Preference? = null + private var displayOverApps: SwitchPreferenceCompat? = null private var updateUtil: UpdateUtil? = null private var activeDownloadCount = 0 @@ -125,6 +128,22 @@ class GeneralSettingsFragment : BaseSettingsFragment() { true } + displayOverApps = findPreference("display_over_apps") + displayOverApps?.isChecked = Settings.canDrawOverlays(requireContext()) + displayOverApps?.onPreferenceClickListener = + Preference.OnPreferenceClickListener { + runCatching { + val i = Intent( + Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + requireContext().packageName) + ) + i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + startActivity(i) + displayOverAppsResultLauncher.launch(i) + } + true + } + ignoreBatteryOptimization = findPreference("ignore_battery") ignoreBatteryOptimization!!.onPreferenceClickListener = Preference.OnPreferenceClickListener { @@ -145,4 +164,12 @@ class GeneralSettingsFragment : BaseSettingsFragment() { super.onResume() } + private var displayOverAppsResultLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result -> + findNavController().popBackStack(R.id.appearanceSettingsFragment, false) + } + + + } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt index f30b2816..3c7d89ee 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/MainSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/MainSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.app.Activity import android.content.DialogInterface @@ -24,24 +24,24 @@ import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceManager import androidx.work.WorkInfo import androidx.work.WorkManager -import com.deniscerri.ytdlnis.BuildConfig -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.CookieItem -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.models.SearchHistoryItem -import com.deniscerri.ytdlnis.database.models.TemplateShortcut -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.CookieViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ObserveSourcesViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.util.UpdateUtil +import com.deniscerri.ytdl.BuildConfig +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.CookieItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.models.SearchHistoryItem +import com.deniscerri.ytdl.database.models.TemplateShortcut +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.CookieViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ObserveSourcesViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.util.UpdateUtil import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import com.google.gson.Gson diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt index 5a58082c..4b5bd705 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/ProcessingSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/ProcessingSettingsFragment.kt @@ -1,11 +1,11 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.os.Bundle import androidx.preference.EditTextPreference import androidx.preference.Preference import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.UiUtil class ProcessingSettingsFragment : BaseSettingsFragment() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/SettingsActivity.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/SettingsActivity.kt index c8333b30..8ed3788b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/SettingsActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/SettingsActivity.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.content.Context import android.os.Bundle @@ -6,9 +6,9 @@ import androidx.activity.addCallback import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.databinding.ActivitySettingsBinding -import com.deniscerri.ytdlnis.ui.BaseActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.databinding.ActivitySettingsBinding +import com.deniscerri.ytdl.ui.BaseActivity class SettingsActivity : BaseActivity() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/UpdateSettingsFragment.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/settings/UpdateSettingsFragment.kt index b66e5ecb..22792085 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/settings/UpdateSettingsFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/settings/UpdateSettingsFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.settings +package com.deniscerri.ytdl.ui.more.settings import android.content.SharedPreferences import android.os.Bundle @@ -7,10 +7,10 @@ import android.widget.TextView import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.BuildConfig -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.util.UiUtil -import com.deniscerri.ytdlnis.util.UpdateUtil +import com.deniscerri.ytdl.BuildConfig +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.UiUtil +import com.deniscerri.ytdl.util.UpdateUtil import com.google.android.material.snackbar.Snackbar import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.Dispatchers diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalActivity.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalActivity.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalActivity.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalActivity.kt index 13e0bd23..078524ad 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalActivity.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.terminal +package com.deniscerri.ytdl.ui.more.terminal import android.annotation.SuppressLint import android.content.Intent @@ -12,10 +12,10 @@ import androidx.navigation.NavArgument import androidx.navigation.NavGraph import androidx.navigation.NavType import androidx.navigation.fragment.NavHostFragment -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.viewmodel.TerminalViewModel -import com.deniscerri.ytdlnis.ui.BaseActivity -import com.deniscerri.ytdlnis.util.FileUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.TerminalViewModel +import com.deniscerri.ytdl.ui.BaseActivity +import com.deniscerri.ytdl.util.FileUtil import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalDownloadsListFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalDownloadsListFragment.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalDownloadsListFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalDownloadsListFragment.kt index 6925ebba..22fbab3e 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalDownloadsListFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalDownloadsListFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.terminal +package com.deniscerri.ytdl.ui.more.terminal import android.os.Bundle import android.view.LayoutInflater @@ -16,11 +16,11 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.work.WorkManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.TerminalItem -import com.deniscerri.ytdlnis.database.viewmodel.TerminalViewModel -import com.deniscerri.ytdlnis.ui.adapter.TerminalDownloadsAdapter -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.TerminalItem +import com.deniscerri.ytdl.database.viewmodel.TerminalViewModel +import com.deniscerri.ytdl.ui.adapter.TerminalDownloadsAdapter +import com.deniscerri.ytdl.util.Extensions.enableFastScroll import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.progressindicator.LinearProgressIndicator import kotlinx.coroutines.flow.collectLatest @@ -77,7 +77,8 @@ class TerminalDownloadsListFragment : Fragment(), TerminalDownloadsAdapter.OnIte val id = work.progress.getInt("id", 0) if(id == 0) return@forEach - val progress = work.progress.getInt("progress", 0) + var progress = work.progress.getInt("progress", 0) + if (progress < 0) progress = 0 val output = work.progress.getString("output") val progressBar = view.findViewWithTag("$id##progress") @@ -85,8 +86,8 @@ class TerminalDownloadsListFragment : Fragment(), TerminalDownloadsAdapter.OnIte requireActivity().runOnUiThread { kotlin.runCatching { - progressBar?.setProgressCompat(progress, true) outputText?.text = output + progressBar?.setProgressCompat(progress, true) } } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalFragment.kt b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalFragment.kt rename to app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt index 5576d167..96a0567b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/more/terminal/TerminalFragment.kt +++ b/app/src/main/java/com/deniscerri/ytdl/ui/more/terminal/TerminalFragment.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.ui.more.terminal +package com.deniscerri.ytdl.ui.more.terminal import android.app.ActionBar.LayoutParams import android.app.Activity @@ -31,15 +31,15 @@ import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.work.WorkInfo import androidx.work.WorkManager -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.TerminalItem -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.TerminalViewModel -import com.deniscerri.ytdlnis.util.Extensions.enableTextHighlight -import com.deniscerri.ytdlnis.util.Extensions.setCustomTextSize -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.util.UiUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.TerminalItem +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.TerminalViewModel +import com.deniscerri.ytdl.util.Extensions.enableTextHighlight +import com.deniscerri.ytdl.util.Extensions.setCustomTextSize +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.NotificationUtil +import com.deniscerri.ytdl.util.UiUtil import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.bottomappbar.BottomAppBar import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/CrashListener.kt b/app/src/main/java/com/deniscerri/ytdl/util/CrashListener.kt similarity index 74% rename from app/src/main/java/com/deniscerri/ytdlnis/util/CrashListener.kt rename to app/src/main/java/com/deniscerri/ytdl/util/CrashListener.kt index 06cee09a..b4438e8f 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/CrashListener.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/CrashListener.kt @@ -1,13 +1,10 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.content.Context -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.dao.LogDao -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.repository.LogRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/Extensions.kt b/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt similarity index 78% rename from app/src/main/java/com/deniscerri/ytdlnis/util/Extensions.kt rename to app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt index bdd923fd..04edce70 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/Extensions.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/Extensions.kt @@ -1,12 +1,15 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.animation.ValueAnimator import android.annotation.SuppressLint import android.app.Dialog import android.content.Context import android.content.res.Resources +import android.graphics.Bitmap +import android.graphics.Canvas import android.graphics.Color import android.graphics.Outline +import android.graphics.drawable.Drawable import android.graphics.drawable.ShapeDrawable import android.graphics.drawable.shapes.OvalShape import android.media.MediaMetadataRetriever @@ -23,13 +26,16 @@ import android.widget.EditText import android.widget.ImageView import android.widget.TextView import androidx.annotation.Px +import androidx.core.content.ContextCompat import androidx.core.view.updateLayoutParams import androidx.lifecycle.lifecycleScope import androidx.lifecycle.withStarted import androidx.recyclerview.widget.RecyclerView -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.repository.DownloadRepository +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.observeSources.ObserveSourcesItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository.EveryCategory import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.tabs.TabLayout @@ -42,6 +48,7 @@ import me.zhanghai.android.fastscroll.FastScrollerBuilder import org.json.JSONObject import java.io.File import java.net.HttpCookie +import java.util.Calendar import java.util.Locale import java.util.regex.Pattern import kotlin.math.abs @@ -327,6 +334,69 @@ object Extensions { // Get the Set-Cookie header format return cookie.toString() } + + fun ObserveSourcesItem.calculateNextTime() : Long { + val item = this + Calendar.getInstance().apply { + if (item.everyCategory != com.deniscerri.ytdl.database.repository.ObserveSourcesRepository.EveryCategory.HOUR){ + val hourMin = Calendar.getInstance() + hourMin.timeInMillis = item.everyTime + + set(Calendar.HOUR_OF_DAY, hourMin.get(Calendar.HOUR_OF_DAY)) + set(Calendar.MINUTE, hourMin.get(Calendar.MINUTE)) + } + + when(item.everyCategory){ + EveryCategory.HOUR -> { + add(Calendar.HOUR, item.everyNr) + } + EveryCategory.DAY -> { + add(Calendar.DAY_OF_MONTH, item.everyNr) + } + EveryCategory.WEEK -> { + item.weeklyConfig?.apply { + if (this.weekDays.isEmpty()){ + add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) + }else{ + var weekDayNr = get(Calendar.DAY_OF_WEEK) - 1 + if (weekDayNr == 0) weekDayNr = 7 + val followingWeekDay = this.weekDays.firstOrNull { it > weekDayNr } + if (followingWeekDay == null){ + add(Calendar.DAY_OF_MONTH, this.weekDays.minBy { it } + (7 - weekDayNr)) + item.everyNr-- + }else{ + add(Calendar.DAY_OF_MONTH, followingWeekDay.toInt() - weekDayNr) + } + + if (item.everyNr > 1){ + add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) + } + } + } + } + EveryCategory.MONTH -> { + add(Calendar.MONTH, item.everyNr) + item.monthlyConfig?.apply { + set(Calendar.DAY_OF_MONTH, this.everyMonthDay) + } + } + } + + return timeInMillis + } + } + + fun Int.toBitmap(context: Context): Bitmap{ + val drawable = ContextCompat.getDrawable(context, this) + val bitmap = Bitmap.createBitmap( + drawable!!.intrinsicWidth, + drawable.intrinsicHeight, Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + drawable.setBounds(0, 0, canvas.width, canvas.height) + drawable.draw(canvas) + return bitmap + } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt similarity index 99% rename from app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt index c33f9a62..61d3ddb5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/FileUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/FileUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.content.Context import android.media.MediaScannerConnection @@ -15,7 +15,7 @@ import com.anggrayudi.storage.callback.FolderCallback import com.anggrayudi.storage.file.copyFolderTo import com.anggrayudi.storage.file.getAbsolutePath import com.anggrayudi.storage.file.moveFileTo -import com.deniscerri.ytdlnis.App +import com.deniscerri.ytdl.App import com.yausername.youtubedl_android.YoutubeDLRequest import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/InfoUtil.kt similarity index 96% rename from app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/InfoUtil.kt index eb4a6e6d..3853149b 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/InfoUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/InfoUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.annotation.SuppressLint import android.content.Context @@ -12,15 +12,15 @@ import android.widget.Toast import androidx.preference.PreferenceManager import com.afollestad.materialdialogs.utils.MDUtil.getStringArray import com.anggrayudi.storage.extension.count -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.ChapterItem -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.ResultItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.Extensions.getIntByAny -import com.deniscerri.ytdlnis.util.Extensions.getStringByAny -import com.deniscerri.ytdlnis.util.Extensions.toStringDuration +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.ChapterItem +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.ResultItem +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.Extensions.getIntByAny +import com.deniscerri.ytdl.util.Extensions.getStringByAny +import com.deniscerri.ytdl.util.Extensions.toStringDuration import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.yausername.youtubedl_android.YoutubeDL @@ -35,7 +35,6 @@ import java.io.InputStreamReader import java.lang.reflect.Type import java.net.HttpURLConnection import java.net.URL -import java.text.SimpleDateFormat import java.util.* import java.util.regex.Pattern @@ -1085,18 +1084,6 @@ class InfoUtil(private val context: Context) { request.addOption("--audio-quality", sharedPreferences.getInt("audio_quality", 0)) } - if (downloadItem.extraCommands.isNotBlank()){ - val cache = File(FileUtil.getCachePath(context)) - cache.mkdirs() - val conf = File(cache.absolutePath + "/${System.currentTimeMillis()}${UUID.randomUUID()}.txt") - conf.createNewFile() - conf.writeText(downloadItem.extraCommands) - request.addOption( - "--config-locations", - conf.absolutePath - ) - } - if (sharedPreferences.getBoolean("write_description", false)){ request.addOption("--write-description") } @@ -1131,9 +1118,6 @@ class InfoUtil(private val context: Context) { "$audioQualityId/${audioQualityId.split("-")[0]}" } } - if (audioQualityId.contains("-") && !downloadItem.format.lang.isNullOrBlank() && downloadItem.format.lang != "None"){ - audioQualityId = "ba[format_id~='^(${audioQualityId.split("-")[0]})'][language^=${downloadItem.format.lang}]/ba/b" - } request.addOption("-f", audioQualityId) }else{ //enters here if generic or quick downloaded with ba format @@ -1169,7 +1153,9 @@ class InfoUtil(private val context: Context) { request.addOption("--embed-metadata") request.addOption("--parse-metadata", "artist:(?P[^,]+)") request.addOption("--parse-metadata", "%(album_artist,meta_album_artist,uploader)s:%(album_artist)s") - request.addOption("--parse-metadata", "%(release_year,release_date>%Y,upload_date>%Y)s:%(meta_date)s") + + request.addOption("--parse-metadata", "description:(?:Released on: )(?P\\d{4})") + request.addOption("--parse-metadata", "%(dscrptn_year,release_year,release_date>%Y,upload_date>%Y)s:%(meta_date)s") if (downloadItem.playlistTitle.isNotEmpty()) { request.addOption("--parse-metadata", "%(album,playlist,title)s:%(meta_album)s") @@ -1234,7 +1220,19 @@ class InfoUtil(private val context: Context) { //format logic var videoF = downloadItem.format.format_id - var audioF = downloadItem.videoPreferences.audioFormatIDs.joinToString("+").ifBlank { "ba" } + var audioF = downloadItem.videoPreferences.audioFormatIDs.joinToString("+") { f -> + val format = downloadItem.allFormats.find { it.format_id == f } + format?.run { + if (this.format_id.contains("-")) { + if (!this.lang.isNullOrBlank() && this.lang != "None") { + "ba[format_id~='^(${this.format_id.split("-")[0]})'][language^=${this.lang}]" + } else { + "${this.format_id}/${this.format_id.split("-")[0]}" + } + } else this.format_id + } ?: f + + }.ifBlank { "ba" } val preferredAudioLanguage = sharedPreferences.getString("audio_language", "")!! if (downloadItem.videoPreferences.removeAudio) audioF = "" @@ -1252,10 +1250,9 @@ class InfoUtil(private val context: Context) { f.append("$videoF/bv/b") }else{ //with audio - audioF = "+$audioF" - f.append("$videoF$audioF/$videoF+ba/$videoF/b") + f.append("$videoF+$audioF/$videoF+ba/$videoF/b") - if (audioF.count("+") > 1){ + if (audioF.count("+") > 0){ request.addOption("--audio-multistreams") } } @@ -1334,6 +1331,7 @@ class InfoUtil(private val context: Context) { } StringBuilder().apply { + if (sharedPreferences.getBoolean("prefer_smaller_formats", false)) append(",+size") if (vCodecPref.isNotBlank()) append(",vcodec:$vCodecPref") if (aCodecPref.isNotBlank()) append(",acodec:$aCodecPref") if (cont.isNotBlank()) append(",ext:$cont") @@ -1400,6 +1398,19 @@ class InfoUtil(private val context: Context) { else -> {} } + if (downloadItem.extraCommands.isNotBlank() && downloadItem.type != DownloadViewModel.Type.command){ + val cache = File(FileUtil.getCachePath(context)) + cache.mkdirs() + val conf = File(cache.absolutePath + "/${System.currentTimeMillis()}${UUID.randomUUID()}.txt") + conf.createNewFile() + conf.writeText(downloadItem.extraCommands) + request.addOption( + "--config-locations", + conf.absolutePath + ) + } + + return request } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/NotificationUtil.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/NotificationUtil.kt index 40c63f0b..1c627df5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/NotificationUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/NotificationUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.app.Notification import android.app.NotificationChannel @@ -16,14 +16,13 @@ import androidx.core.app.NotificationCompat import androidx.core.content.FileProvider import androidx.documentfile.provider.DocumentFile import androidx.navigation.NavDeepLinkBuilder -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.receiver.CancelDownloadNotificationReceiver -import com.deniscerri.ytdlnis.receiver.CancelWorkReceiver -import com.deniscerri.ytdlnis.receiver.PauseDownloadNotificationReceiver -import com.deniscerri.ytdlnis.receiver.ResumeActivity -import com.deniscerri.ytdlnis.receiver.ShareFileActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.receiver.CancelDownloadNotificationReceiver +import com.deniscerri.ytdl.receiver.CancelWorkReceiver +import com.deniscerri.ytdl.receiver.PauseDownloadNotificationReceiver +import com.deniscerri.ytdl.receiver.ResumeActivity +import com.deniscerri.ytdl.util.Extensions.toBitmap import java.io.File @@ -166,7 +165,7 @@ class NotificationUtil(var context: Context) { .setContentText("") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) - .setProgress(PROGRESS_MAX, PROGRESS_CURR, false) + .setProgress(PROGRESS_MAX, PROGRESS_CURR, true) .setContentIntent(pendingIntent) .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) .clearActions() @@ -229,18 +228,34 @@ class NotificationUtil(var context: Context) { ) { val notificationBuilder = getBuilder(DOWNLOAD_FINISHED_CHANNEL_ID) + val iconType = when(downloadType){ + DownloadViewModel.Type.audio -> { + R.drawable.ic_music + } + DownloadViewModel.Type.video -> { + R.drawable.ic_video + } + DownloadViewModel.Type.command -> { + R.drawable.ic_terminal + } + + else -> R.drawable.ic_launcher_foreground_large + } + + val bitmap = iconType.toBitmap(context) + val bigPictureStyle = NotificationCompat.BigPictureStyle() + bigPictureStyle.bigLargeIcon(bitmap) + if (Build.VERSION.SDK_INT >= 31){ + bigPictureStyle.showBigPictureWhenCollapsed(true) + } + notificationBuilder - .setContentTitle("${res.getString(R.string.downloaded)} (${downloadType}): $title") + .setContentTitle("${res.getString(R.string.downloaded)} $title") .setSmallIcon(R.drawable.ic_launcher_foreground_large) - .setLargeIcon( - BitmapFactory.decodeResource( - res, - R.drawable.ic_launcher_foreground_large - ) - ) .setGroup(DOWNLOAD_FINISHED_NOTIFICATION_ID.toString()) .setGroupAlertBehavior(NotificationCompat.GROUP_ALERT_CHILDREN) .setContentText(title) + .setStyle(bigPictureStyle) .setPriority(NotificationCompat.PRIORITY_MAX) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .clearActions() @@ -345,7 +360,6 @@ class NotificationUtil(var context: Context) { .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .clearActions() if (logID != null){ - notificationBuilder.setContentIntent(errorPendingIntent) notificationBuilder.addAction(0, res.getString(R.string.logs), errorPendingIntent) } notificationManager.notify(DOWNLOAD_ERRORED_NOTIFICATION_ID + id.toInt(), notificationBuilder.build()) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/ThemeUtil.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/ThemeUtil.kt index 85067e8b..1623a777 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/ThemeUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/ThemeUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.content.ComponentName import android.content.Context @@ -11,7 +11,7 @@ import androidx.appcompat.app.AppCompatDelegate import androidx.core.text.HtmlCompat import androidx.core.text.parseAsHtml import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.R +import com.deniscerri.ytdl.R import com.google.android.material.color.DynamicColors @@ -57,7 +57,7 @@ object ThemeUtil { //disable old icons for (appIcon in availableIcons) { - val activityClass = "com.deniscerri.ytdlnis." + appIcon.activityAlias + val activityClass = "com.deniscerri.ytdl." + appIcon.activityAlias // remove old icons activity.packageManager.setComponentEnabledSetting( @@ -71,7 +71,7 @@ object ThemeUtil { "System" -> { //set dynamic icon activity.packageManager.setComponentEnabledSetting( - ComponentName(activity.packageName, "com.deniscerri.ytdlnis.Default"), + ComponentName(activity.packageName, "com.deniscerri.ytdl.Default"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) @@ -81,7 +81,7 @@ object ThemeUtil { "Light" -> { //set light icon activity.packageManager.setComponentEnabledSetting( - ComponentName(activity.packageName, "com.deniscerri.ytdlnis.LightIcon"), + ComponentName(activity.packageName, "com.deniscerri.ytdl.LightIcon"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) @@ -91,7 +91,7 @@ object ThemeUtil { "Dark" -> { //set dark icon activity.packageManager.setComponentEnabledSetting( - ComponentName(activity.packageName, "com.deniscerri.ytdlnis.DarkIcon"), + ComponentName(activity.packageName, "com.deniscerri.ytdl.DarkIcon"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) @@ -101,7 +101,7 @@ object ThemeUtil { else -> { //set dynamic icon activity.packageManager.setComponentEnabledSetting( - ComponentName(activity.packageName, "com.deniscerri.ytdlnis.Default"), + ComponentName(activity.packageName, "com.deniscerri.ytdl.Default"), PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP ) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt similarity index 93% rename from app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt index fada9020..bdce24ac 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UiUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/UiUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.annotation.SuppressLint import android.app.Activity @@ -9,8 +9,6 @@ import android.content.DialogInterface import android.content.Intent import android.net.Uri import android.os.Build -import android.os.Handler -import android.os.Looper import android.text.Editable import android.text.TextWatcher import android.text.format.DateFormat @@ -35,7 +33,6 @@ import androidx.appcompat.content.res.AppCompatResources import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.FileProvider import androidx.core.view.isVisible -import androidx.core.view.setMargins import androidx.core.widget.doOnTextChanged import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.FragmentManager @@ -44,24 +41,24 @@ import androidx.preference.PreferenceManager import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.CommandTemplate -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.TemplateShortcut -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.viewmodel.CommandTemplateViewModel -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.database.viewmodel.HistoryViewModel -import com.deniscerri.ytdlnis.database.viewmodel.ResultViewModel -import com.deniscerri.ytdlnis.ui.adapter.AlreadyExistsAdapter -import com.deniscerri.ytdlnis.ui.downloadcard.ConfigureDownloadBottomSheetDialog -import com.deniscerri.ytdlnis.ui.downloadcard.VideoCutListener -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll -import com.deniscerri.ytdlnis.util.Extensions.enableTextHighlight -import com.deniscerri.ytdlnis.util.Extensions.getMediaDuration -import com.deniscerri.ytdlnis.util.Extensions.toStringDuration +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.CommandTemplate +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.TemplateShortcut +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.viewmodel.CommandTemplateViewModel +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.database.viewmodel.HistoryViewModel +import com.deniscerri.ytdl.database.viewmodel.ResultViewModel +import com.deniscerri.ytdl.ui.adapter.AlreadyExistsAdapter +import com.deniscerri.ytdl.ui.downloadcard.ConfigureDownloadBottomSheetDialog +import com.deniscerri.ytdl.ui.downloadcard.VideoCutListener +import com.deniscerri.ytdl.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.util.Extensions.enableTextHighlight +import com.deniscerri.ytdl.util.Extensions.getMediaDuration +import com.deniscerri.ytdl.util.Extensions.toStringDuration import com.google.android.material.badge.BadgeDrawable import com.google.android.material.badge.BadgeUtils import com.google.android.material.badge.ExperimentalBadgeUtils @@ -168,7 +165,14 @@ object UiUtil { card.tag = item.id } - fun showCommandTemplateCreationOrUpdatingSheet(item: CommandTemplate?, context: Activity, lifeCycle: LifecycleOwner, commandTemplateViewModel: CommandTemplateViewModel, newTemplate: (newTemplate: CommandTemplate) -> Unit){ + fun showCommandTemplateCreationOrUpdatingSheet( + item: CommandTemplate?, + context: Activity, + lifeCycle: LifecycleOwner, + commandTemplateViewModel: CommandTemplateViewModel, + newTemplate: (newTemplate: CommandTemplate) -> Unit, + dismissed: () -> Unit + ){ val bottomSheet = BottomSheetDialog(context) bottomSheet.requestWindowFeature(Window.FEATURE_NO_TITLE) bottomSheet.setContentView(R.layout.create_command_template) @@ -302,6 +306,10 @@ object UiUtil { bottomSheet.cancel() } + bottomSheet.setOnDismissListener { + dismissed() + } + bottomSheet.show() bottomSheet.behavior.state = BottomSheetBehavior.STATE_EXPANDED bottomSheet.window!!.setLayout( @@ -1839,8 +1847,9 @@ object UiUtil { val builder = MaterialAlertDialogBuilder(context) builder.setTitle(dialogTitle) val view = context.layoutInflater.inflate(R.layout.filename_template_dialog, null) + val textInput = view.findViewById(R.id.filename) val editText = view.findViewById(R.id.filename_edittext) - view.findViewById(R.id.filename).hint = context.getString(R.string.file_name_template) + textInput.hint = context.getString(R.string.file_name_template) editText.setText(currentFilename) editText.setSelection(editText.text.length) builder.setView(view) @@ -1861,8 +1870,6 @@ object UiUtil { context.startActivity(browserIntent) } - view.findViewById(R.id.suggested).visibility = View.GONE - val dialog = builder.create() dialog.show() val imm = context.getSystemService(AppCompatActivity.INPUT_METHOD_SERVICE) as InputMethodManager @@ -1871,8 +1878,68 @@ object UiUtil { imm.showSoftInput(editText, 0) }, 300) - //handle suggestion chips + + val preferences = PreferenceManager.getDefaultSharedPreferences(context) + val myTemplates = preferences.getStringSet("filename_templates", setOf())!!.toMutableSet() + val myTemplatesView = view.findViewById(R.id.mytemplates) + val myTemplatesChipGroup = view.findViewById(R.id.filename_personal_chipgroup) + + textInput.setEndIconOnClickListener { + if (editText.text.isBlank()) return@setEndIconOnClickListener + val chip = createPersonalFilenameTemplateChip(context, editText.text.toString(), myTemplatesChipGroup, + onClick = { chip -> + if (chip.isChecked){ + editText.setText(chip.text.toString()) + val selectionStart = editText.selectionStart + editText.setSelection(selectionStart + chip.text.length) + }else{ + editText.setText("") + } + + }, + onLongClick = { + showGenericDeleteDialog(context, it.text.toString()) { + myTemplates.remove(it.text.toString()) + myTemplatesView.isVisible = myTemplates.isNotEmpty() + myTemplatesChipGroup.removeView(it) + preferences.edit().putStringSet("filename_templates", myTemplates).apply() + } + } + ) + chip.isChecked = true + textInput.endIconDrawable = null + myTemplates.add(editText.text.toString()) + preferences.edit().putStringSet("filename_templates", myTemplates).apply() + myTemplatesChipGroup.addView(chip) + myTemplatesView.isVisible = true + } + CoroutineScope(Dispatchers.IO).launch { + //handle personal template chips + val mychips = mutableListOf() + myTemplates.forEachIndexed { index, s -> + val chip = createPersonalFilenameTemplateChip(context, s, myTemplatesChipGroup, + onClick = { c -> + if (c.isChecked){ + editText.setText(c.text.toString()) + val selectionStart = editText.selectionStart + editText.setSelection(selectionStart + c.text.length) + }else{ + editText.setText("") + } + }, + onLongClick = { c -> + showGenericDeleteDialog(context, c.text.toString()) { + myTemplates.remove(c.text.toString()) + myTemplatesView.isVisible = myTemplates.isNotEmpty() + myTemplatesChipGroup.removeView(c) + preferences.edit().putStringSet("filename_templates", myTemplates).apply() + } + } + ) + mychips.add(chip) + } + //handle suggestion chips val chipGroup = view.findViewById(R.id.filename_suggested_chipgroup) val chips = mutableListOf() context.getStringArray(R.array.filename_templates).forEachIndexed { index, s -> @@ -1892,7 +1959,18 @@ object UiUtil { chips.add(tmp) } + + withContext(Dispatchers.Main){ + if (mychips.isNotEmpty()){ + myTemplatesView.isVisible = true + mychips.forEach { + it.isChecked = editText.text.contains(it.text) + myTemplatesChipGroup!!.addView(it) + } + } + + view.findViewById(R.id.suggested).visibility = View.VISIBLE chips.forEach { it.isChecked = editText.text.contains(it.text) @@ -1903,6 +1981,16 @@ object UiUtil { chips.forEach { it.isChecked = editText.text.contains(it.text) } + + mychips.forEach { + it.isChecked = editText.text.contains(it.text) + } + + if (!myTemplates.contains(editText.text.toString()) && editText.text.isNotBlank()){ + textInput.endIconDrawable = AppCompatResources.getDrawable(context, R.drawable.ic_plus) + }else{ + textInput.endIconDrawable = null + } } } } @@ -1910,6 +1998,26 @@ object UiUtil { dialog.getButton(AlertDialog.BUTTON_NEUTRAL).gravity = Gravity.START } + private fun createPersonalFilenameTemplateChip(context: Activity, text: String, myChipGroup: ChipGroup, onClick: (f: Chip) -> Unit, onLongClick: (f: Chip) -> Unit) : Chip { + val tmp = context.layoutInflater.inflate(R.layout.filter_chip, myChipGroup, false) as Chip + tmp.text = text + if (Build.VERSION.SDK_INT >= 26){ + tmp.tooltipText = text + } + + tmp.setOnClickListener { + onClick(it as Chip) + } + + tmp.setOnLongClickListener { + onLongClick(it as Chip) + true + } + + return tmp + + } + fun showPipedInstancesDialog(context: Activity, currentInstance: String, instanceSelected: (f: String) -> Unit){ val builder = MaterialAlertDialogBuilder(context) builder.setTitle(context.getString(R.string.piped_instance)) diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/UpdateUtil.kt similarity index 98% rename from app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/UpdateUtil.kt index 1823a9c4..518b0ef5 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/UpdateUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/UpdateUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.annotation.SuppressLint import android.app.Activity @@ -23,10 +23,9 @@ import android.widget.TextView import android.widget.Toast import androidx.core.content.ContextCompat.startActivity import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.BuildConfig -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.models.GithubRelease -import com.deniscerri.ytdlnis.util.Extensions.enableFastScroll +import com.deniscerri.ytdl.BuildConfig +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.models.GithubRelease import com.google.android.material.card.MaterialCardView import com.google.android.material.chip.Chip import com.google.android.material.chip.ChipGroup diff --git a/app/src/main/java/com/deniscerri/ytdlnis/util/VideoPlayerUtil.kt b/app/src/main/java/com/deniscerri/ytdl/util/VideoPlayerUtil.kt similarity index 97% rename from app/src/main/java/com/deniscerri/ytdlnis/util/VideoPlayerUtil.kt rename to app/src/main/java/com/deniscerri/ytdl/util/VideoPlayerUtil.kt index b07980c2..5a05a15c 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/util/VideoPlayerUtil.kt +++ b/app/src/main/java/com/deniscerri/ytdl/util/VideoPlayerUtil.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.util +package com.deniscerri.ytdl.util import android.content.Context import androidx.media3.common.AudioAttributes diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/AlarmScheduler.kt b/app/src/main/java/com/deniscerri/ytdl/work/AlarmScheduler.kt similarity index 62% rename from app/src/main/java/com/deniscerri/ytdlnis/work/AlarmScheduler.kt rename to app/src/main/java/com/deniscerri/ytdl/work/AlarmScheduler.kt index e787811f..b3861fc3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/AlarmScheduler.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/AlarmScheduler.kt @@ -1,17 +1,16 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work -import android.app.AlarmManager -import android.app.PendingIntent import android.content.Context -import android.content.Intent import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.receiver.downloadAlarmReceivers.AlarmStartReceiver -import com.deniscerri.ytdlnis.receiver.downloadAlarmReceivers.AlarmStopReceiver +import androidx.work.Constraints +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager import java.util.Calendar +import java.util.concurrent.TimeUnit class AlarmScheduler(private val context: Context) { - private val alarmManager = context.getSystemService(AlarmManager::class.java) private val preferences = PreferenceManager.getDefaultSharedPreferences(context) fun schedule() { @@ -25,14 +24,21 @@ class AlarmScheduler(private val context: Context) { sTime.set(Calendar.SECOND, 0) val time = calculateNextTime(sTime) - val intent = Intent(context, AlarmStartReceiver::class.java) - alarmManager.setExactAndAllowWhileIdle( - AlarmManager.RTC, - time.timeInMillis, - PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) + //schedule starting work + val workConstraints = Constraints.Builder() + val workRequest = OneTimeWorkRequestBuilder() + .addTag("scheduledDownload") + .addTag("download") + .setConstraints(workConstraints.build()) + .setInitialDelay(System.currentTimeMillis() - time.timeInMillis, TimeUnit.MILLISECONDS) + + WorkManager.getInstance(context).enqueueUniqueWork( + System.currentTimeMillis().toString(), + ExistingWorkPolicy.REPLACE, + workRequest.build() ) - //schedule closing alarm + //schedule closing work val endingTime = preferences.getString("schedule_end", "05:00")!! val eTime = Calendar.getInstance() eTime.set(Calendar.HOUR_OF_DAY, endingTime.split(":")[0].toInt()) @@ -41,32 +47,23 @@ class AlarmScheduler(private val context: Context) { val calendar = calculateNextTime(eTime) - val intent2 = Intent(context, AlarmStopReceiver::class.java) - alarmManager.setExactAndAllowWhileIdle( - AlarmManager.RTC, - calendar.timeInMillis + 60000, - PendingIntent.getBroadcast(context, 1, intent2, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) + val workRequest2 = OneTimeWorkRequestBuilder() + .addTag("cancelScheduledDownload") + .setConstraints(workConstraints.build()) + .setInitialDelay(System.currentTimeMillis() - calendar.timeInMillis + 60000, TimeUnit.MILLISECONDS) + + WorkManager.getInstance(context).enqueueUniqueWork( + System.currentTimeMillis().toString(), + ExistingWorkPolicy.REPLACE, + workRequest2.build() ) + } fun cancel() { - alarmManager.cancel( - PendingIntent.getBroadcast( - context, - 0, - Intent(context, AlarmStartReceiver::class.java), - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - ) - - alarmManager.cancel( - PendingIntent.getBroadcast( - context, - 1, - Intent(context, AlarmStopReceiver::class.java), - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - ) + val wm = WorkManager.getInstance(context) + wm.cancelAllWorkByTag("scheduledDownload") + wm.cancelAllWorkByTag("cancelScheduledDownload") } fun calculateNextTime(c: Calendar) : Calendar { diff --git a/app/src/main/java/com/deniscerri/ytdl/work/CancelScheduledDownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/CancelScheduledDownloadWorker.kt new file mode 100644 index 00000000..f377cf2a --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdl/work/CancelScheduledDownloadWorker.kt @@ -0,0 +1,72 @@ +package com.deniscerri.ytdl.work + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.Configuration +import android.content.res.Resources +import android.os.Handler +import android.os.Looper +import android.util.DisplayMetrics +import android.util.Log +import android.widget.Toast +import androidx.navigation.NavDeepLinkBuilder +import androidx.preference.PreferenceManager +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkInfo +import androidx.work.WorkManager +import androidx.work.WorkerParameters +import androidx.work.await +import androidx.work.workDataOf +import com.afollestad.materialdialogs.utils.MDUtil.getStringArray +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.LogRepository +import com.deniscerri.ytdl.database.repository.ResultRepository +import com.deniscerri.ytdl.util.Extensions.getMediaDuration +import com.deniscerri.ytdl.util.Extensions.toStringDuration +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil +import com.yausername.youtubedl_android.YoutubeDL +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import java.io.File +import java.util.Locale +import kotlin.random.Random + + +class CancelScheduledDownloadWorker( + private val context: Context, + workerParams: WorkerParameters +) : CoroutineWorker(context, workerParams) { + @SuppressLint("RestrictedApi") + override suspend fun doWork(): Result { + if (isStopped) return Result.success() + val dbManager = DBManager.getInstance(context) + val dao = dbManager.downloadDao + + val runningDownloads = dao.getActiveDownloadsList() + WorkManager.getInstance(context).cancelAllWorkByTag("download") + runningDownloads.forEach { + YoutubeDL.getInstance().destroyProcessById(it.id.toString()) + } + return Result.success() + } + + + + companion object { + val runningYTDLInstances: MutableList = mutableListOf() + const val TAG = "DownloadWorker" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/DownloadWorker.kt similarity index 95% rename from app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/DownloadWorker.kt index 60b612a8..3a9168be 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/DownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/DownloadWorker.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work import android.annotation.SuppressLint import android.content.Context @@ -19,19 +19,19 @@ import androidx.work.WorkerParameters import androidx.work.await import androidx.work.workDataOf import com.afollestad.materialdialogs.utils.MDUtil.getStringArray -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.models.HistoryItem -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.repository.LogRepository -import com.deniscerri.ytdlnis.database.repository.ResultRepository -import com.deniscerri.ytdlnis.util.Extensions.getMediaDuration -import com.deniscerri.ytdlnis.util.Extensions.toStringDuration -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.HistoryItem +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.LogRepository +import com.deniscerri.ytdl.database.repository.ResultRepository +import com.deniscerri.ytdl.util.Extensions.getMediaDuration +import com.deniscerri.ytdl.util.Extensions.toStringDuration +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil import com.yausername.youtubedl_android.YoutubeDL import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -306,9 +306,7 @@ class DownloadWorker( }else{ logString.append("${it.message}\n") logItem.content = logString.toString() - val logID = withContext(Dispatchers.IO){ - logRepo.insert(logItem) - } + val logID = logRepo.insert(logItem) downloadItem.logID = logID } } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/MoveCacheFilesWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/work/MoveCacheFilesWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt index 1c9fa353..afa94097 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/MoveCacheFilesWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/MoveCacheFilesWorker.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work import android.app.PendingIntent import android.content.Context @@ -11,11 +11,11 @@ import android.widget.Toast import androidx.work.ForegroundInfo import androidx.work.Worker import androidx.work.WorkerParameters -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.MainActivity -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.MainActivity +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.NotificationUtil import java.io.File import java.nio.file.Files import java.nio.file.StandardCopyOption diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/ObserveSourceWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/ObserveSourceWorker.kt similarity index 85% rename from app/src/main/java/com/deniscerri/ytdlnis/work/ObserveSourceWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/ObserveSourceWorker.kt index 58cf3ea7..e73f7b28 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/ObserveSourceWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/ObserveSourceWorker.kt @@ -1,30 +1,30 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work -import android.app.AlarmManager -import android.app.PendingIntent import android.content.Context -import android.content.Intent import androidx.preference.PreferenceManager +import androidx.work.Constraints import androidx.work.CoroutineWorker import androidx.work.Data +import androidx.work.ExistingWorkPolicy import androidx.work.ForegroundInfo +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager import androidx.work.WorkerParameters -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.models.DownloadItem -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.database.repository.HistoryRepository -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository -import com.deniscerri.ytdlnis.database.repository.ResultRepository -import com.deniscerri.ytdlnis.receiver.ObserveAlarmReceiver -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.DownloadItem +import com.deniscerri.ytdl.database.repository.DownloadRepository +import com.deniscerri.ytdl.database.repository.HistoryRepository +import com.deniscerri.ytdl.database.repository.ObserveSourcesRepository +import com.deniscerri.ytdl.database.repository.ResultRepository +import com.deniscerri.ytdl.util.Extensions.calculateNextTime +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil import com.google.gson.Gson import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import java.util.Calendar +import java.util.concurrent.TimeUnit class ObserveSourceWorker( @@ -45,7 +45,6 @@ class ObserveSourceWorker( val item = repo.getByID(sourceID) if (item.status == ObserveSourcesRepository.SourceStatus.STOPPED){ - repo.cancelObservationTaskByID(context, item.id) return Result.failure() } @@ -198,7 +197,6 @@ class ObserveSourceWorker( withContext(Dispatchers.IO){ repo.update(item) } - repo.cancelObservationTaskByID(context, item.id) return Result.success() } @@ -207,14 +205,18 @@ class ObserveSourceWorker( } //schedule for next time - val alarmManager = context.getSystemService(AlarmManager::class.java) - val intent = Intent(context, ObserveAlarmReceiver::class.java) - intent.putExtra("id", item.id) + val workConstraints = Constraints.Builder() + val workRequest = OneTimeWorkRequestBuilder() + .addTag("observeSources") + .addTag(sourceID.toString()) + .setConstraints(workConstraints.build()) + .setInitialDelay(System.currentTimeMillis() - item.calculateNextTime(), TimeUnit.MILLISECONDS) + .setInputData(Data.Builder().putLong("id", sourceID).build()) - alarmManager.setExact( - AlarmManager.RTC_WAKEUP, - repo.calculateNextTime(item), - PendingIntent.getBroadcast(context, item.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) + WorkManager.getInstance(context).enqueueUniqueWork( + "OBSERVE$sourceID", + ExistingWorkPolicy.REPLACE, + workRequest.build() ) return Result.success() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/TerminalDownloadWorker.kt similarity index 92% rename from app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/TerminalDownloadWorker.kt index aded7b60..1b4f939a 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/TerminalDownloadWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/TerminalDownloadWorker.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work import android.app.PendingIntent import android.content.Context @@ -12,15 +12,15 @@ import androidx.work.CoroutineWorker import androidx.work.ForegroundInfo import androidx.work.WorkerParameters import androidx.work.workDataOf -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.models.Format -import com.deniscerri.ytdlnis.database.models.LogItem -import com.deniscerri.ytdlnis.database.repository.LogRepository -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.ui.more.terminal.TerminalActivity -import com.deniscerri.ytdlnis.util.FileUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.R +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.models.Format +import com.deniscerri.ytdl.database.models.LogItem +import com.deniscerri.ytdl.database.repository.LogRepository +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.ui.more.terminal.TerminalActivity +import com.deniscerri.ytdl.util.FileUtil +import com.deniscerri.ytdl.util.NotificationUtil import com.yausername.youtubedl_android.YoutubeDL import com.yausername.youtubedl_android.YoutubeDLRequest import kotlinx.coroutines.CoroutineScope diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/UpdatePlaylistFormatsWorker.kt similarity index 90% rename from app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/UpdatePlaylistFormatsWorker.kt index 5e577e17..bf037db1 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdatePlaylistFormatsWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/UpdatePlaylistFormatsWorker.kt @@ -1,15 +1,15 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work import android.content.Context import android.util.Log import androidx.work.ForegroundInfo import androidx.work.Worker import androidx.work.WorkerParameters -import com.deniscerri.ytdlnis.App -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel -import com.deniscerri.ytdlnis.util.InfoUtil -import com.deniscerri.ytdlnis.util.NotificationUtil +import com.deniscerri.ytdl.App +import com.deniscerri.ytdl.database.DBManager +import com.deniscerri.ytdl.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdl.util.InfoUtil +import com.deniscerri.ytdl.util.NotificationUtil import kotlinx.coroutines.runBlocking diff --git a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt b/app/src/main/java/com/deniscerri/ytdl/work/UpdateYTDLWorker.kt similarity index 82% rename from app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt rename to app/src/main/java/com/deniscerri/ytdl/work/UpdateYTDLWorker.kt index afc7d276..73ac9361 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/work/UpdateYTDLWorker.kt +++ b/app/src/main/java/com/deniscerri/ytdl/work/UpdateYTDLWorker.kt @@ -1,9 +1,9 @@ -package com.deniscerri.ytdlnis.work +package com.deniscerri.ytdl.work import android.content.Context import androidx.work.CoroutineWorker import androidx.work.WorkerParameters -import com.deniscerri.ytdlnis.util.UpdateUtil +import com.deniscerri.ytdl.util.UpdateUtil class UpdateYTDLWorker( diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/AutomateItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/AutomateItem.kt deleted file mode 100644 index 80c8db6c..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/AutomateItem.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.deniscerri.ytdlnis.database.models - -import androidx.room.PrimaryKey -import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel.Type - -data class AutomateItem( - @PrimaryKey(autoGenerate = true) - var id: Long, - var title: String, - var url: String, - var intervalNr: Long, - var intervalCategory: String, - var format: Format, - var type: Type, - var downloadPath: String, - var runOnLowBattery: Boolean, - var runOnMobileData: Boolean, - var replaceFiles: Boolean, -) \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ObserveSourcesRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ObserveSourcesRepository.kt deleted file mode 100644 index ec5dea34..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/ObserveSourcesRepository.kt +++ /dev/null @@ -1,121 +0,0 @@ -package com.deniscerri.ytdlnis.database.repository - -import android.app.AlarmManager -import android.app.PendingIntent -import android.content.Context -import android.content.Intent -import com.deniscerri.ytdlnis.R -import com.deniscerri.ytdlnis.database.dao.ObserveSourcesDao -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.receiver.ObserveAlarmReceiver -import kotlinx.coroutines.flow.Flow -import java.util.Calendar - -class ObserveSourcesRepository(private val observeSourcesDao: ObserveSourcesDao) { - val items : Flow> = observeSourcesDao.getAllSourcesFlow() - enum class SourceStatus { - ACTIVE, STOPPED - } - - enum class EveryCategory { - DAY, WEEK, MONTH - } - - companion object { - val everyCategoryName = mapOf( - EveryCategory.DAY to R.string.day, - EveryCategory.WEEK to R.string.week, - EveryCategory.MONTH to R.string.month - ) - } - - - fun getAll() : List { - return observeSourcesDao.getAllSources() - } - - fun getByURL(url: String) : ObserveSourcesItem { - return observeSourcesDao.getByURL(url) - } - - fun getByID(id: Long) : ObserveSourcesItem { - return observeSourcesDao.getByID(id) - } - - - suspend fun insert(item: ObserveSourcesItem) : Long{ - if (!observeSourcesDao.checkIfExistsWithSameURL(item.url)){ - return observeSourcesDao.insert(item) - } - return -1 - } - - suspend fun delete(item: ObserveSourcesItem){ - observeSourcesDao.delete(item.id) - } - - - suspend fun deleteAll(){ - observeSourcesDao.deleteAll() - } - - suspend fun update(item: ObserveSourcesItem){ - observeSourcesDao.update(item) - } - - fun cancelObservationTaskByID(context: Context, id: Long){ - val alarmManager = context.getSystemService(AlarmManager::class.java) - alarmManager.cancel( - PendingIntent.getBroadcast( - context, - id.toInt(), - Intent(context, ObserveAlarmReceiver::class.java), - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - ) - } - - fun calculateNextTime(item: ObserveSourcesItem) : Long { - val c = Calendar.getInstance() - - val hourMin = Calendar.getInstance() - hourMin.timeInMillis = item.everyTime - - c.set(Calendar.HOUR_OF_DAY, hourMin.get(Calendar.HOUR_OF_DAY)) - c.set(Calendar.MINUTE, hourMin.get(Calendar.MINUTE)) - - if (item.everyNr == 0) item.everyNr = 1 - - when(item.everyCategory){ - EveryCategory.DAY -> { - c.add(Calendar.DAY_OF_MONTH, item.everyNr) - } - EveryCategory.WEEK -> { - if(item.everyWeekDay.isEmpty()){ - c.add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) - }else{ - val weekDayNr = c.get(Calendar.DAY_OF_WEEK) - val followingWeekDay = item.everyWeekDay.firstOrNull { it.toInt() > weekDayNr } - if (followingWeekDay == null){ - c.add(Calendar.DAY_OF_MONTH, item.everyWeekDay.minBy { it.toInt() }.toInt() + (7 - weekDayNr)) - item.everyNr-- - }else{ - c.add(Calendar.DAY_OF_MONTH, followingWeekDay.toInt() - weekDayNr) - } - - if (item.everyNr > 1){ - c.add(Calendar.DAY_OF_MONTH, 7 * item.everyNr) - } - } - } - EveryCategory.MONTH -> { - c.add(Calendar.MONTH, item.everyNr) - c.set(Calendar.DAY_OF_MONTH, item.everyMonthDay) - } - } - - - return c.timeInMillis - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ObserveSourcesViewModel.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ObserveSourcesViewModel.kt deleted file mode 100644 index 495999cf..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/viewmodel/ObserveSourcesViewModel.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.deniscerri.ytdlnis.database.viewmodel - -import android.app.AlarmManager -import android.app.Application -import android.app.PendingIntent -import android.content.Intent -import android.content.SharedPreferences -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.LiveData -import androidx.lifecycle.asLiveData -import androidx.lifecycle.viewModelScope -import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.models.ObserveSourcesItem -import com.deniscerri.ytdlnis.database.repository.ObserveSourcesRepository -import com.deniscerri.ytdlnis.receiver.ObserveAlarmReceiver -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.time.Month -import java.util.Calendar - -class ObserveSourcesViewModel(private val application: Application) : AndroidViewModel(application) { - private val repository: ObserveSourcesRepository - val items: LiveData> - private val alarmManager : AlarmManager - private val preferences : SharedPreferences - - init { - val dao = DBManager.getInstance(application).observeSourcesDao - repository = ObserveSourcesRepository(dao) - items = repository.items.asLiveData() - alarmManager = application.getSystemService(AlarmManager::class.java) - preferences = PreferenceManager.getDefaultSharedPreferences(application) - } - - fun getAll(): List { - return repository.getAll() - } - - fun getByURL(url: String) : ObserveSourcesItem { - return repository.getByURL(url) - } - - fun getByID(id: Long) : ObserveSourcesItem { - return repository.getByID(id) - } - - suspend fun insert(item: ObserveSourcesItem) : Long { - if (item.id > 0) { - repository.update(item) - observeTask(item) - return item.id - } - - val id = repository.insert(item) - item.id = id - if (id > 0) observeTask(item) - return id - } - - fun delete(item: ObserveSourcesItem) = viewModelScope.launch(Dispatchers.IO) { - runCatching { repository.cancelObservationTaskByID(application, item.id) } - repository.delete(item) - } - - fun deleteAll() = viewModelScope.launch(Dispatchers.IO) { - getAll().forEach { - runCatching { repository.cancelObservationTaskByID(application, it.id) } - } - - repository.deleteAll() - } - - suspend fun update(item: ObserveSourcesItem) { - repository.update(item) - } - - fun cancelObservationTaskByID(id : Long){ - repository.cancelObservationTaskByID(application, id) - } - - - private fun observeTask(it: ObserveSourcesItem){ - cancelObservationTaskByID(it.id) - - val id = it.id - val c = Calendar.getInstance() - - val date = Calendar.getInstance() - date.timeInMillis = it.startsTime - val hourMin = Calendar.getInstance() - hourMin.timeInMillis = it.everyTime - c.set(Calendar.DAY_OF_MONTH, date.get(Calendar.DAY_OF_MONTH)) - c.set(Calendar.MONTH, date.get(Calendar.MONTH)) - c.set(Calendar.YEAR, date.get(Calendar.YEAR)) - c.set(Calendar.HOUR_OF_DAY, hourMin.get(Calendar.HOUR_OF_DAY)) - c.set(Calendar.MINUTE, hourMin.get(Calendar.MINUTE)) - - val intent = Intent(application, ObserveAlarmReceiver::class.java) - intent.putExtra("id", id) - - when(it.everyCategory){ - ObserveSourcesRepository.EveryCategory.DAY -> {} - ObserveSourcesRepository.EveryCategory.WEEK -> { - val weekDayNr = c.get(Calendar.DAY_OF_WEEK) - val followingWeekDay = it.everyWeekDay.firstOrNull { it.toInt() >= weekDayNr } - if (followingWeekDay == null){ - c.add(Calendar.DAY_OF_MONTH, it.everyWeekDay.minBy { it.toInt() }.toInt() + (7 - weekDayNr)) - }else{ - c.add(Calendar.DAY_OF_MONTH, followingWeekDay.toInt() - weekDayNr) - } - } - ObserveSourcesRepository.EveryCategory.MONTH -> { - val theMonthIndex = Month.values().indexOf(it.startsMonth) - val currentMonthIndex = c.get(Calendar.MONTH) - if (theMonthIndex != currentMonthIndex){ - c.set(Calendar.MONTH, theMonthIndex) - if (c.timeInMillis < Calendar.getInstance().timeInMillis){ - c.add(Calendar.YEAR, 1) - } - } - } - } - - alarmManager.setExact( - AlarmManager.RTC, - c.timeInMillis, - PendingIntent.getBroadcast(application, it.id.toInt(), intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE) - ) - - } - - -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ObserveAlarmReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ObserveAlarmReceiver.kt deleted file mode 100644 index cd435f8e..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ObserveAlarmReceiver.kt +++ /dev/null @@ -1,37 +0,0 @@ -package com.deniscerri.ytdlnis.receiver - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import androidx.work.Constraints -import androidx.work.Data -import androidx.work.ExistingWorkPolicy -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager -import com.deniscerri.ytdlnis.work.ObserveSourceWorker -import java.util.concurrent.TimeUnit - -class ObserveAlarmReceiver : BroadcastReceiver() { - override fun onReceive(p0: Context?, p1: Intent?) { - p1?.apply { - val sourceID = p1.getLongExtra("id", 0) - if (sourceID == 0L) return - - val workConstraints = Constraints.Builder() - val workRequest = OneTimeWorkRequestBuilder() - .addTag("observeSources") - .addTag(sourceID.toString()) - .setConstraints(workConstraints.build()) - .setInitialDelay(1000L, TimeUnit.MILLISECONDS) - .setInputData(Data.Builder().putLong("id", sourceID).build()) - - WorkManager.getInstance(p0!!).enqueueUniqueWork( - "OBSERVE$sourceID", - ExistingWorkPolicy.REPLACE, - workRequest.build() - ) - } - - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt deleted file mode 100644 index b4d1a238..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/ShareFileActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.deniscerri.ytdlnis.receiver - -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 -import com.deniscerri.ytdlnis.util.UiUtil - -class ShareFileActivity : BaseActivity() { - - lateinit var context: Context - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - ThemeUtil.updateTheme(this) - WindowCompat.setDecorFitsSystemWindows(window, false) - ViewCompat.setOnApplyWindowInsetsListener(window.decorView) { v, insets -> - v.setPadding(0, 0, 0, 0) - insets - } - window.run { - setBackgroundDrawable(ColorDrawable(0)) - setLayout( - WindowManager.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.MATCH_PARENT - ) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY) - } else { - setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT) - } - } - - setContentView(R.layout.activity_share) - - val paths = intent.getStringArrayExtra("path") - val notificationId = intent.getIntExtra("notificationID", 0) - NotificationUtil(this).cancelDownloadNotification(notificationId) - 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/receiver/downloadAlarmReceivers/AlarmStartReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/downloadAlarmReceivers/AlarmStartReceiver.kt deleted file mode 100644 index 308f9b08..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/downloadAlarmReceivers/AlarmStartReceiver.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.deniscerri.ytdlnis.receiver.downloadAlarmReceivers - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import androidx.work.Constraints -import androidx.work.ExistingWorkPolicy -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager -import com.deniscerri.ytdlnis.work.DownloadWorker -import java.util.concurrent.TimeUnit - -class AlarmStartReceiver : BroadcastReceiver() { - override fun onReceive(p0: Context?, p1: Intent?) { - val workConstraints = Constraints.Builder() - val workRequest = OneTimeWorkRequestBuilder() - .addTag("download") - .setConstraints(workConstraints.build()) - .setInitialDelay(1000L, TimeUnit.MILLISECONDS) - - WorkManager.getInstance(p0!!).enqueueUniqueWork( - System.currentTimeMillis().toString(), - ExistingWorkPolicy.REPLACE, - workRequest.build() - ) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/receiver/downloadAlarmReceivers/AlarmStopReceiver.kt b/app/src/main/java/com/deniscerri/ytdlnis/receiver/downloadAlarmReceivers/AlarmStopReceiver.kt deleted file mode 100644 index 11f77246..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/receiver/downloadAlarmReceivers/AlarmStopReceiver.kt +++ /dev/null @@ -1,48 +0,0 @@ -package com.deniscerri.ytdlnis.receiver.downloadAlarmReceivers - -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import androidx.preference.PreferenceManager -import com.deniscerri.ytdlnis.database.DBManager -import com.deniscerri.ytdlnis.database.repository.DownloadRepository -import com.deniscerri.ytdlnis.util.NotificationUtil -import com.deniscerri.ytdlnis.work.AlarmScheduler -import com.yausername.youtubedl_android.YoutubeDL -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import java.util.Calendar - -class AlarmStopReceiver : BroadcastReceiver() { - override fun onReceive(p0: Context?, p1: Intent?) { - val dbManager = DBManager.getInstance(p0!!) - val ytdl = YoutubeDL.getInstance() - val notificationUtil = NotificationUtil(p0) - val preferences = PreferenceManager.getDefaultSharedPreferences(p0) - val alarmScheduler = AlarmScheduler(p0) - - CoroutineScope(Dispatchers.IO).launch { - runCatching { - val active = dbManager.downloadDao.getActiveDownloadsList() - - val startingTime = preferences.getString("schedule_start", "00:00")!! - val sTime = Calendar.getInstance() - sTime.set(Calendar.HOUR_OF_DAY, startingTime.split(":")[0].toInt()) - sTime.set(Calendar.MINUTE, startingTime.split(":")[1].toInt()) - sTime.set(Calendar.SECOND, 0) - val time = alarmScheduler.calculateNextTime(sTime) - - active.forEach { - ytdl.destroyProcessById(it.id.toString()) - notificationUtil.cancelDownloadNotification(it.id.toInt()) - it.status = DownloadRepository.Status.Queued.toString() - dbManager.downloadDao.update(it) - } - - AlarmScheduler(p0).schedule() - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt deleted file mode 100644 index 1b46367a..00000000 --- a/app/src/main/java/com/deniscerri/ytdlnis/ui/BaseActivity.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.deniscerri.ytdlnis.ui - -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.deniscerri.ytdlnis.util.ThemeUtil -import com.google.android.material.elevation.SurfaceColors - -open class BaseActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - ThemeUtil.updateTheme(this) - window.navigationBarColor = SurfaceColors.SURFACE_2.getColor(this) - super.onCreate(savedInstanceState) - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_format_id.xml b/app/src/main/res/drawable/ic_format_id.xml new file mode 100644 index 00000000..e7fca93d --- /dev/null +++ b/app/src/main/res/drawable/ic_format_id.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index d2344a3d..089adf1d 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - tools:context="com.deniscerri.ytdlnis.ui.more.settings.SettingsActivity"> + tools:context="com.deniscerri.ytdl.ui.more.settings.SettingsActivity"> @@ -29,40 +31,87 @@ - - - + android:orientation="vertical"> - + + + app:layout_constraintHeight_max="200dp" + android:paddingHorizontal="10dp" + app:layout_constraintVertical_bias="0.0" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/suggested"> - + - + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_command_templates.xml b/app/src/main/res/layout/fragment_command_templates.xml index 8caec8a2..e448b498 100644 --- a/app/src/main/res/layout/fragment_command_templates.xml +++ b/app/src/main/res/layout/fragment_command_templates.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.deniscerri.ytdlnis.ui.more.terminal.TerminalActivity"> + tools:context="com.deniscerri.ytdl.ui.more.terminal.TerminalActivity"> + tools:context="com.deniscerri.ytdl.ui.more.terminal.TerminalActivity"> + tools:context="com.deniscerri.ytdl.ui.more.terminal.TerminalActivity"> + tools:context="com.deniscerri.ytdl.ui.more.terminal.TerminalActivity"> + tools:context="com.deniscerri.ytdl.ui.more.terminal.TerminalActivity"> + tools:composableName="com.deniscerri.ytdl.ui.more.WebViewActivity.WebViewView" /> diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 281a04c2..c20ccfb4 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -21,7 +21,7 @@ app:destination="@id/settingsNav" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/settings_nav.xml b/app/src/main/res/navigation/settings_nav.xml index edcdc179..e98ae758 100644 --- a/app/src/main/res/navigation/settings_nav.xml +++ b/app/src/main/res/navigation/settings_nav.xml @@ -4,27 +4,27 @@ app:startDestination="@id/mainSettingsFragment"> \ No newline at end of file diff --git a/app/src/main/res/navigation/terminal_graph.xml b/app/src/main/res/navigation/terminal_graph.xml index f6c9be11..6d3e7326 100644 --- a/app/src/main/res/navigation/terminal_graph.xml +++ b/app/src/main/res/navigation/terminal_graph.xml @@ -5,7 +5,7 @@ app:startDestination="@id/terminalDownloadsListFragment"> Get New Uploads Only Also Download as Audio Wrap Text - Scroll Down + Scroll to the Bottom Text Size Add Back @@ -377,4 +377,9 @@ Reset Already Processed Links Don\'t download as Fragments Don\'t use .part files and write directly into output file + My Filename Templates + Prefer Smaller Sized Formats + Display Over Apps + Make the download card always display on top. Turn this on if the currently running app closes when the download card shows up + Hour \ No newline at end of file diff --git a/app/src/main/res/xml-v25/shortcuts.xml b/app/src/main/res/xml-v25/shortcuts.xml new file mode 100644 index 00000000..29ef6be4 --- /dev/null +++ b/app/src/main/res/xml-v25/shortcuts.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/general_preferences.xml b/app/src/main/res/xml/general_preferences.xml index d1fa12ae..0a9a4ca6 100644 --- a/app/src/main/res/xml/general_preferences.xml +++ b/app/src/main/res/xml/general_preferences.xml @@ -57,6 +57,14 @@ app:key="modify_download_card" app:title="@string/modify_download_card" /> + + diff --git a/app/src/main/res/xml/processing_preferences.xml b/app/src/main/res/xml/processing_preferences.xml index 10638e1b..c85822e8 100644 --- a/app/src/main/res/xml/processing_preferences.xml +++ b/app/src/main/res/xml/processing_preferences.xml @@ -237,14 +237,23 @@ + + \ No newline at end of file diff --git a/app/src/main/res/xml/shortcuts.xml b/app/src/main/res/xml/shortcuts.xml new file mode 100644 index 00000000..6d727ba3 --- /dev/null +++ b/app/src/main/res/xml/shortcuts.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/src/test/java/com/deniscerri/ytdlnis/ExampleUnitTest.kt b/app/src/test/java/com/deniscerri/ytdl/ExampleUnitTest.kt similarity index 91% rename from app/src/test/java/com/deniscerri/ytdlnis/ExampleUnitTest.kt rename to app/src/test/java/com/deniscerri/ytdl/ExampleUnitTest.kt index 36ef53a3..b322a935 100644 --- a/app/src/test/java/com/deniscerri/ytdlnis/ExampleUnitTest.kt +++ b/app/src/test/java/com/deniscerri/ytdl/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.deniscerri.ytdlnis +package com.deniscerri.ytdl import org.junit.Assert import org.junit.Test diff --git a/build.gradle b/build.gradle index c39a30f4..ea585dba 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,7 @@ buildscript { commonsCompressVer = '1.12' youtubedlAndroidVer = "-SNAPSHOT" youtubedlAndroidVerNoPyCrypto = "97bee6c0e8" + oldytdlAndroidVer = "0.14.0" workVer = "2.9.0" composeVer = '1.4.2' kotlinVer = "1.7.21" diff --git a/fastlane/metadata/android/en-US/changelogs/10740.txt b/fastlane/metadata/android/en-US/changelogs/10740.txt new file mode 100644 index 00000000..a55200ed --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/10740.txt @@ -0,0 +1,67 @@ +## What's New + +- Added select between two items in home screen +- Fixed select between in cancelled screen not working +- Fixed app crashing when you selected a generic format for multiple items at once +- Fixed graphical glitch on RTL screens when the navigation bar showed up in landscape when moving tabs in download queue +- Moved the cache location to the data folder so its accessible to everyone. If for some reason the app cant read that folder, it will use the old cache location +- Fixed app not converting thumbnail to png even if set so +- Slightly changed the thumbnail cropping command since the png thumbnail commands got added +- Fixed app sometimes not closing the share activity when you dismiss the multiple download card +- Fixed app not enabling sub languages chip when you only selected save auto subtitles +- Added the title of the finished notification to the bottom if you want to see the full one +- Added a toggle in the settings to disable downloading the file as a fragment +- Slightly changed the counter badge offset in the download queue +- Fixed app not checking save auto subtitles when you get back to it +- Added indeterminate progress bar for running downloads notification if its in the beginning +- Reverted cookies functionality since it was broken for people. It will always sign you out when you generate the cookie + + +### Added supported web addresses to the app + +- you can make this app be the default launcher for some website links +currently the sites supported are the major yt-dlp extractors: +facebook +twitter +instagram +youtube +soundcloud +tiktok +bilibili +twitch + +- Fixed huge bug of app sometimes showing the title of the previous video in the home screen +- Added select between two items in history screen +- Added select between two items in command templates screen +- Added select between two items when choosing playlist items +- Fixed app sometimes not downloading suggested chapters from the cut screen +- Added "EVERY HOUR" in the observe sources screen + +### Added shortcuts when long pressing the app icon + +- I added 4 actions +Search +Downloads +Download Queue +New Command Template + +- Added big icon to the finished download notification showing the download type +- Added a new permission to make the app be always on top. This slightly helps with the revanced pip issue. The download hook button sometimes sends you to pip but through the share menu its fixed. Not sure how to resolve this. will look further. If anyone has a solution, let me know +- Fixed app downloading the original language of a video even though you chose another language. This was a bug with piped formats format id parsing +- Fixed app not cancelling updating data of an item in the download card +- Added a preference to prefer smaller sized formats +- Added ability to choose another audio format in the video tab but not reset the video format +- Sometimes the preferred resolution is not available, and the video defaulted to the maximum resolution when it should select the next higher quality. +- Now formats that already have audio formats in them show the audio chip in the format list +- Added an internal crash listener for the app. If the app crashes, it creates a crash log for you with the error stacktrace +- Added ability to have saved filename templates. You can add them straight from the filename template dialog. They will also show up at the top of the list +- fixed app sometimes not selecting preferred format based on format id even if it exists +- fixed app not matching preferred vp9 codec formats + + +### Observe sources table had some changes and it was recreated + +If you have any observe sources running, try recreating them manually. Backup and restore wont work as the structure is different + +- Added parse metadata commands for audio type to fetch the release year if the description has it +- Removed alarm manager and instead relied in workmanager for scheduled downloads due to android 14 restrictions \ No newline at end of file