diff --git a/app/build.gradle b/app/build.gradle index 418ddf77..c9aaa2ae 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -192,8 +192,18 @@ dependencies { implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.10" implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0' - implementation "com.google.android.exoplayer:exoplayer:2.18.7" implementation 'it.xabaras.android:recyclerview-swipedecorator:1.4' implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.1" implementation "com.github.Irineu333:Highlight-KT:1.0.4" + + // For media playback using ExoPlayer + implementation("androidx.media3:media3-exoplayer:$media3_version") + // For DASH playback support with ExoPlayer + implementation("androidx.media3:media3-exoplayer-dash:$media3_version") + // For HLS playback support with ExoPlayer + implementation("androidx.media3:media3-exoplayer-hls:$media3_version") + implementation("androidx.media3:media3-ui:$media3_version") + // For RTSP playback support with ExoPlayer + implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") + implementation("androidx.media3:media3-datasource-cronet:$media3_version") } diff --git a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json index 74d8248d..df2c826b 100644 --- a/app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json +++ b/app/schemas/com.deniscerri.ytdlnis.database.DBManager/8.json @@ -2,7 +2,7 @@ "formatVersion": 1, "database": { "version": 8, - "identityHash": "b21f2aa737d29eef2c1bf6418b314726", + "identityHash": "3d472df655311f8e531602dca2886c34", "entities": [ { "tableName": "results", @@ -180,7 +180,7 @@ }, { "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, `customFileNameTemplate` TEXT NOT NULL, `SaveThumb` INTEGER NOT NULL, `status` TEXT NOT NULL DEFAULT 'Queued', `downloadStartTime` INTEGER NOT NULL DEFAULT 0, `logID` INTEGER)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `url` TEXT NOT NULL, `title` TEXT NOT NULL, `author` TEXT NOT NULL, `thumb` TEXT NOT NULL, `duration` TEXT NOT NULL, `type` TEXT NOT NULL, `format` TEXT NOT NULL, `container` TEXT NOT NULL DEFAULT 'Default', `downloadSections` TEXT NOT NULL DEFAULT '', `allFormats` TEXT NOT NULL, `downloadPath` TEXT NOT NULL, `website` TEXT NOT NULL, `downloadSize` TEXT NOT NULL, `playlistTitle` TEXT NOT NULL, `audioPreferences` TEXT NOT NULL, `videoPreferences` TEXT NOT NULL, `extraCommands` TEXT NOT NULL DEFAULT '', `customFileNameTemplate` TEXT NOT NULL, `SaveThumb` INTEGER NOT NULL, `status` TEXT NOT NULL DEFAULT 'Queued', `downloadStartTime` INTEGER NOT NULL DEFAULT 0, `logID` INTEGER)", "fields": [ { "fieldPath": "id", @@ -286,6 +286,13 @@ "affinity": "TEXT", "notNull": true }, + { + "fieldPath": "extraCommands", + "columnName": "extraCommands", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, { "fieldPath": "customFileNameTemplate", "columnName": "customFileNameTemplate", @@ -446,7 +453,7 @@ }, { "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)", + "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", @@ -465,6 +472,24 @@ "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": { @@ -480,7 +505,7 @@ "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, 'b21f2aa737d29eef2c1bf6418b314726')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '3d472df655311f8e531602dca2886c34')" ] } } \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 1c6f7ed6..773e8123 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -16,16 +16,20 @@ import android.os.Handler import android.provider.Settings import android.util.Log import android.view.View +import android.view.ViewGroup import android.view.WindowInsets import android.widget.CheckBox import android.widget.TextView import androidx.annotation.RequiresApi import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.app.ActivityCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.forEach import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding import androidx.fragment.app.FragmentContainerView import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.lifecycleScope diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt index fea64407..6f1a6d89 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/DownloadLogsAdapter.kt @@ -1,6 +1,8 @@ package com.deniscerri.ytdlnis.adapter +import android.annotation.SuppressLint import android.app.Activity +import android.text.format.DateFormat import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -12,29 +14,38 @@ import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView import com.deniscerri.ytdlnis.R +import com.deniscerri.ytdlnis.database.models.DownloadItem import com.deniscerri.ytdlnis.database.models.LogItem +import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdlnis.util.FileUtil +import com.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView import java.io.File +import java.text.SimpleDateFormat +import java.util.Locale class DownloadLogsAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { private val onItemClickListener: OnItemClickListener private val activity: Activity + private val checkedItems: ArrayList init { + checkedItems = ArrayList() this.onItemClickListener = onItemClickListener this.activity = activity } class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { - val item: ConstraintLayout + val item: MaterialCardView init { - item = itemView.findViewById(R.id.download_log_item_constraint) + item = itemView.findViewById(R.id.log_card_view) } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val cardView = LayoutInflater.from(parent.context) - .inflate(R.layout.download_log_item, parent, false) + .inflate(R.layout.log_card, parent, false) return ViewHolder(cardView, onItemClickListener) } @@ -45,20 +56,112 @@ class DownloadLogsAdapter(onItemClickListener: OnItemClickListener, activity: Ac val title = card.findViewById(R.id.title) title.text = item?.title - val delete = card.findViewById