diff --git a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt index 1173a67f..53de4ea3 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/MainActivity.kt @@ -25,6 +25,7 @@ import com.deniscerri.ytdlnis.database.models.ResultItem import com.deniscerri.ytdlnis.databinding.ActivityMainBinding import com.deniscerri.ytdlnis.service.IDownloaderListener import com.deniscerri.ytdlnis.service.IDownloaderService +import com.deniscerri.ytdlnis.ui.DownloadFragment import com.deniscerri.ytdlnis.ui.HistoryFragment import com.deniscerri.ytdlnis.ui.HomeFragment import com.deniscerri.ytdlnis.ui.MoreFragment @@ -46,6 +47,7 @@ class MainActivity : AppCompatActivity() { lateinit var context: Context private lateinit var homeFragment: HomeFragment private lateinit var historyFragment: HistoryFragment + private lateinit var downloadFragment: DownloadFragment private lateinit var workManager: WorkManager override fun onCreate(savedInstanceState: Bundle?) { @@ -61,6 +63,7 @@ class MainActivity : AppCompatActivity() { homeFragment = HomeFragment() historyFragment = HistoryFragment() + downloadFragment = DownloadFragment() moreFragment = MoreFragment() initFragments() binding.bottomNavigationView.setOnItemSelectedListener { item: MenuItem -> @@ -77,10 +80,18 @@ class MainActivity : AppCompatActivity() { if (lastFragment === historyFragment) { historyFragment.scrollToTop() } else { - this.title = getString(R.string.downloads) + this.title = getString(R.string.history) } replaceFragment(historyFragment) } + R.id.downloads -> { + if (lastFragment === downloadFragment) { + downloadFragment.scrollToTop() + } else { + this.title = getString(R.string.downloads) + } + replaceFragment(downloadFragment) + } R.id.more -> { if (lastFragment === moreFragment) { val intent = Intent(context, SettingsActivity::class.java) @@ -118,6 +129,7 @@ class MainActivity : AppCompatActivity() { Log.e(TAG, action) homeFragment = HomeFragment() historyFragment = HistoryFragment() + downloadFragment = DownloadFragment() moreFragment = MoreFragment() if (type.equals("application/txt", ignoreCase = true)) { try { @@ -152,9 +164,11 @@ class MainActivity : AppCompatActivity() { fm.beginTransaction() .replace(R.id.frame_layout, homeFragment) .add(R.id.frame_layout, historyFragment) + .add(R.id.frame_layout, downloadFragment) .add(R.id.frame_layout, moreFragment) .hide(historyFragment) .hide(moreFragment) + .hide(downloadFragment) .commit() lastFragment = homeFragment listeners = ArrayList() diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt new file mode 100644 index 00000000..fe5fa386 --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/ActiveDownloadAdapter.kt @@ -0,0 +1,195 @@ +package com.deniscerri.ytdlnis.adapter + +import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.Color +import android.graphics.ColorMatrix +import android.graphics.ColorMatrixColorFilter +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +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.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView +import com.squareup.picasso.Picasso +import java.io.File +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* + +class ActiveDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { + private val checkedItems: ArrayList + private val onItemClickListener: OnItemClickListener + private val activity: Activity + + init { + checkedItems = ArrayList() + this.onItemClickListener = onItemClickListener + this.activity = activity + } + + class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { + val cardView: MaterialCardView + + init { + cardView = itemView.findViewById(R.id.downloads_card_view) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val cardView = LayoutInflater.from(parent.context) + .inflate(R.layout.history_card, parent, false) + return ViewHolder(cardView, onItemClickListener) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + val card = holder.cardView + // THUMBNAIL ---------------------------------- + val thumbnail = card.findViewById(R.id.downloads_image_view) + val imageURL = item!!.thumb + val uiHandler = Handler(Looper.getMainLooper()) + if (imageURL.isNotEmpty()) { + uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) } + } else { + uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } + } + thumbnail.setColorFilter(Color.argb(95, 0, 0, 0)) + + // TITLE ---------------------------------- + val itemTitle = card.findViewById(R.id.downloads_title) + var title = item.title + if (title.length > 100) { + title = title.substring(0, 40) + "..." + } + itemTitle.text = title + + // Bottom Info ---------------------------------- + val bottomInfo = card.findViewById(R.id.downloads_info_bottom) + var info = item.author + if (item.duration.isNotEmpty()) { + if (item.author.isNotEmpty()) info += " • " + info += item.duration + } + bottomInfo.text = info + + // TIME DOWNLOADED ---------------------------------- + val datetime = card.findViewById(R.id.downloads_info_time) + val time = item.time + val downloadedTime: String + if (time == 0L) { + downloadedTime = activity.getString(R.string.currently_downloading) + " " + item.type + } else { + val cal = Calendar.getInstance() + val date = Date(time * 1000L) + cal.time = date + val day = cal[Calendar.DAY_OF_MONTH] + val month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()) + val year = cal[Calendar.YEAR] + val formatter: DateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) + val timeString = formatter.format(date) + downloadedTime = "$day $month $year - $timeString" + } + datetime.text = downloadedTime + + // BUTTON ---------------------------------- + val buttonLayout = card.findViewById(R.id.downloads_download_button_layout) + val btn = buttonLayout.findViewById(R.id.downloads_download_button_type) + var filePresent = true + + //IS IN THE FILE SYSTEM? + val path = item.downloadPath + val file = File(path) + if (!file.exists() && path.isNotEmpty()) { + filePresent = false + thumbnail.colorFilter = ColorMatrixColorFilter(object : ColorMatrix() { + init { + setSaturation(0f) + } + }) + thumbnail.alpha = 0.7f + } + if (item.type.isNotEmpty()) { + if (item.type == "audio") { + if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music) + } else { + if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) + } + } + if (btn.hasOnClickListeners()) btn.setOnClickListener(null) + if (checkedItems.contains(item.id)) { + card.isChecked = true + card.strokeWidth = 5 + } else { + card.isChecked = false + card.strokeWidth = 0 + } + val finalFilePresent = filePresent + card.setOnLongClickListener { + checkCard(card, item.id) + true + } + card.setOnClickListener { + if (checkedItems.size > 0) { + checkCard(card, item.id) + } else { + onItemClickListener.onCardClick(item.id, finalFilePresent) + } + } + } + + private fun checkCard(card: MaterialCardView, itemID: Long) { + if (card.isChecked) { + card.strokeWidth = 0 + checkedItems.remove(itemID) + } else { + card.strokeWidth = 5 + checkedItems.add(itemID) + } + card.isChecked = !card.isChecked + onItemClickListener.onCardSelect(itemID, card.isChecked) + } + + interface OnItemClickListener { + fun onCardClick(itemID: Long, isPresent: Boolean) + fun onCardSelect(itemID: Long, isChecked: Boolean) + fun onButtonClick(position: Int) + } + + @SuppressLint("NotifyDataSetChanged") + fun clearCheckeditems() { + for (i in 0 until itemCount){ + val item = getItem(i) + if (checkedItems.find { it == item?.id } != null){ + checkedItems.remove(item?.id) + notifyItemChanged(i) + } + } + + checkedItems.clear() + } + + companion object { + private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: HistoryItem, newItem: HistoryItem): Boolean { + val ranged = arrayListOf(oldItem.id, newItem.id) + return ranged[0] == ranged[1] + } + + override fun areContentsTheSame(oldItem: HistoryItem, newItem: HistoryItem): Boolean { + return oldItem.time == newItem.time + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt index 66678b3e..cc5224bb 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/HistoryAdapter.kt @@ -7,6 +7,7 @@ import android.graphics.ColorMatrix import android.graphics.ColorMatrixColorFilter import android.os.Handler import android.os.Looper +import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -111,6 +112,7 @@ class HistoryAdapter(onItemClickListener: OnItemClickListener, activity: Activit //IS IN THE FILE SYSTEM? val path = item.downloadPath val file = File(path) + Log.e("aa", file.absolutePath + " " + file.isFile) if (!file.exists() && path.isNotEmpty()) { filePresent = false thumbnail.colorFilter = ColorMatrixColorFilter(object : ColorMatrix() { diff --git a/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt b/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt new file mode 100644 index 00000000..270e542a --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdlnis/adapter/QueuedDownloadAdapter.kt @@ -0,0 +1,195 @@ +package com.deniscerri.ytdlnis.adapter + +import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.Color +import android.graphics.ColorMatrix +import android.graphics.ColorMatrixColorFilter +import android.os.Handler +import android.os.Looper +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +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.google.android.material.button.MaterialButton +import com.google.android.material.card.MaterialCardView +import com.squareup.picasso.Picasso +import java.io.File +import java.text.DateFormat +import java.text.SimpleDateFormat +import java.util.* + +class QueuedDownloadAdapter(onItemClickListener: OnItemClickListener, activity: Activity) : ListAdapter(AsyncDifferConfig.Builder(DIFF_CALLBACK).build()) { + private val checkedItems: ArrayList + private val onItemClickListener: OnItemClickListener + private val activity: Activity + + init { + checkedItems = ArrayList() + this.onItemClickListener = onItemClickListener + this.activity = activity + } + + class ViewHolder(itemView: View, onItemClickListener: OnItemClickListener?) : RecyclerView.ViewHolder(itemView) { + val cardView: MaterialCardView + + init { + cardView = itemView.findViewById(R.id.downloads_card_view) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val cardView = LayoutInflater.from(parent.context) + .inflate(R.layout.history_card, parent, false) + return ViewHolder(cardView, onItemClickListener) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val item = getItem(position) + val card = holder.cardView + // THUMBNAIL ---------------------------------- + val thumbnail = card.findViewById(R.id.downloads_image_view) + val imageURL = item!!.thumb + val uiHandler = Handler(Looper.getMainLooper()) + if (imageURL.isNotEmpty()) { + uiHandler.post { Picasso.get().load(imageURL).into(thumbnail) } + } else { + uiHandler.post { Picasso.get().load(R.color.black).into(thumbnail) } + } + thumbnail.setColorFilter(Color.argb(95, 0, 0, 0)) + + // TITLE ---------------------------------- + val itemTitle = card.findViewById(R.id.downloads_title) + var title = item.title + if (title.length > 100) { + title = title.substring(0, 40) + "..." + } + itemTitle.text = title + + // Bottom Info ---------------------------------- + val bottomInfo = card.findViewById(R.id.downloads_info_bottom) + var info = item.author + if (item.duration.isNotEmpty()) { + if (item.author.isNotEmpty()) info += " • " + info += item.duration + } + bottomInfo.text = info + + // TIME DOWNLOADED ---------------------------------- + val datetime = card.findViewById(R.id.downloads_info_time) + val time = item.time + val downloadedTime: String + if (time == 0L) { + downloadedTime = activity.getString(R.string.currently_downloading) + " " + item.type + } else { + val cal = Calendar.getInstance() + val date = Date(time * 1000L) + cal.time = date + val day = cal[Calendar.DAY_OF_MONTH] + val month = cal.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.getDefault()) + val year = cal[Calendar.YEAR] + val formatter: DateFormat = SimpleDateFormat("HH:mm", Locale.getDefault()) + val timeString = formatter.format(date) + downloadedTime = "$day $month $year - $timeString" + } + datetime.text = downloadedTime + + // BUTTON ---------------------------------- + val buttonLayout = card.findViewById(R.id.downloads_download_button_layout) + val btn = buttonLayout.findViewById(R.id.downloads_download_button_type) + var filePresent = true + + //IS IN THE FILE SYSTEM? + val path = item.downloadPath + val file = File(path) + if (!file.exists() && path.isNotEmpty()) { + filePresent = false + thumbnail.colorFilter = ColorMatrixColorFilter(object : ColorMatrix() { + init { + setSaturation(0f) + } + }) + thumbnail.alpha = 0.7f + } + if (item.type.isNotEmpty()) { + if (item.type == "audio") { + if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_music) + } else { + if (filePresent) btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video_downloaded) else btn.icon = ContextCompat.getDrawable(activity, R.drawable.ic_video) + } + } + if (btn.hasOnClickListeners()) btn.setOnClickListener(null) + if (checkedItems.contains(item.id)) { + card.isChecked = true + card.strokeWidth = 5 + } else { + card.isChecked = false + card.strokeWidth = 0 + } + val finalFilePresent = filePresent + card.setOnLongClickListener { + checkCard(card, item.id) + true + } + card.setOnClickListener { + if (checkedItems.size > 0) { + checkCard(card, item.id) + } else { + onItemClickListener.onCardClick(item.id, finalFilePresent) + } + } + } + + private fun checkCard(card: MaterialCardView, itemID: Long) { + if (card.isChecked) { + card.strokeWidth = 0 + checkedItems.remove(itemID) + } else { + card.strokeWidth = 5 + checkedItems.add(itemID) + } + card.isChecked = !card.isChecked + onItemClickListener.onCardSelect(itemID, card.isChecked) + } + + interface OnItemClickListener { + fun onCardClick(itemID: Long, isPresent: Boolean) + fun onCardSelect(itemID: Long, isChecked: Boolean) + fun onButtonClick(position: Int) + } + + @SuppressLint("NotifyDataSetChanged") + fun clearCheckeditems() { + for (i in 0 until itemCount){ + val item = getItem(i) + if (checkedItems.find { it == item?.id } != null){ + checkedItems.remove(item?.id) + notifyItemChanged(i) + } + } + + checkedItems.clear() + } + + companion object { + private val DIFF_CALLBACK: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: HistoryItem, newItem: HistoryItem): Boolean { + val ranged = arrayListOf(oldItem.id, newItem.id) + return ranged[0] == ranged[1] + } + + override fun areContentsTheSame(oldItem: HistoryItem, newItem: HistoryItem): Boolean { + return oldItem.time == newItem.time + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt index 724db235..9bc3cff6 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/dao/DownloadDao.kt @@ -22,7 +22,7 @@ interface DownloadDao { fun getProcessingDownloads() : LiveData> @Query("SELECT * FROM downloads WHERE workID=:workID") - fun getDownloadByWorkId(workID: Int) : DownloadItem + fun getDownloadByWorkId(workID: Long) : DownloadItem @Query("SELECT * FROM downloads WHERE id=:id LIMIT 1") fun getDownloadById(id: Long) : DownloadItem diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt index f5c0e7a6..ae34b0dd 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/models/DownloadItem.kt @@ -26,5 +26,5 @@ data class DownloadItem( val SaveThumb: Boolean, @ColumnInfo(defaultValue = "Queued") var status: String, - val workID: Int + var workID: Long ) \ No newline at end of file diff --git a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt index 3629f3a2..62e3cf23 100644 --- a/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt +++ b/app/src/main/java/com/deniscerri/ytdlnis/database/repository/DownloadRepository.kt @@ -27,7 +27,7 @@ class DownloadRepository(private val downloadDao: DownloadDao) { downloadDao.update(item) } - fun getDownloadByWorkID(workID: Int) : DownloadItem{ + fun getDownloadByWorkID(workID: Long) : DownloadItem{ return downloadDao.getDownloadByWorkId(workID) } diff --git a/app/src/main/java/com/deniscerri/ytdlnis/ui/DownloadFragment.kt b/app/src/main/java/com/deniscerri/ytdlnis/ui/DownloadFragment.kt new file mode 100644 index 00000000..5d29ecf0 --- /dev/null +++ b/app/src/main/java/com/deniscerri/ytdlnis/ui/DownloadFragment.kt @@ -0,0 +1,282 @@ +package com.deniscerri.ytdlnis.ui + +import android.app.Activity +import android.content.* +import android.net.Uri +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.view.* +import android.view.View.* +import android.widget.* +import androidx.core.content.FileProvider +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.deniscerri.ytdlnis.MainActivity +import com.deniscerri.ytdlnis.R +import com.deniscerri.ytdlnis.adapter.ActiveDownloadAdapter +import com.deniscerri.ytdlnis.adapter.QueuedDownloadAdapter +import com.deniscerri.ytdlnis.database.models.DownloadItem +import com.deniscerri.ytdlnis.database.models.HistoryItem +import com.deniscerri.ytdlnis.database.viewmodel.DownloadViewModel +import com.deniscerri.ytdlnis.databinding.FragmentHistoryBinding +import com.deniscerri.ytdlnis.util.FileUtil +import com.facebook.shimmer.ShimmerFrameLayout +import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.appbar.MaterialToolbar +import com.google.android.material.bottomsheet.BottomSheetDialog +import com.google.android.material.chip.ChipGroup +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton +import java.io.File + +/** + * A fragment representing a list of Items. + */ +class DownloadFragment : Fragment(), ActiveDownloadAdapter.OnItemClickListener, QueuedDownloadAdapter.OnItemClickListener, + OnClickListener, OnLongClickListener { + private lateinit var downloadViewModel : DownloadViewModel + + private var downloading = false + private var fragmentView: View? = null + private var activity: Activity? = null + private var mainActivity: MainActivity? = null + private var fragmentContext: Context? = null + private var layoutinflater: LayoutInflater? = null + private var shimmerCards: ShimmerFrameLayout? = null + private var topAppBar: MaterialToolbar? = null + private var activeRecyclerView: RecyclerView? = null + private var othersRecyclerView: RecyclerView? = null + private var downloadsAdapter: ActiveDownloadAdapter? = null + private var queuedDownloadsAdapter: QueuedDownloadAdapter? = null + private var bottomSheet: BottomSheetDialog? = null + private var sortSheet: BottomSheetDialog? = null + private var uiHandler: Handler? = null + private var noResults: RelativeLayout? = null + private var websiteGroup: ChipGroup? = null + private var downloadsList: List? = null + private var allDownloadsList: List? = null + private var selectedObjects: ArrayList? = null + private var deleteFab: ExtendedFloatingActionButton? = null + private var fileUtil: FileUtil? = null + + private var _binding : FragmentHistoryBinding? = null + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentHistoryBinding.inflate(inflater, container, false) + fragmentView = inflater.inflate(R.layout.fragment_downloads, container, false) + activity = getActivity() + mainActivity = activity as MainActivity? + + return fragmentView + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + fragmentContext = context + layoutinflater = LayoutInflater.from(context) + topAppBar = view.findViewById(R.id.downloads_toolbar) + noResults = view.findViewById(R.id.no_results) + websiteGroup = view.findViewById(R.id.website_chip_group) + deleteFab = view.findViewById(R.id.delete_selected_fab) + fileUtil = FileUtil() + deleteFab?.tag = "deleteSelected" + deleteFab?.setOnClickListener(this) + uiHandler = Handler(Looper.getMainLooper()) + selectedObjects = ArrayList() + downloading = mainActivity!!.isDownloadServiceRunning() + + + downloadsList = mutableListOf() + allDownloadsList = mutableListOf() + + downloadsAdapter = + ActiveDownloadAdapter( + this, + requireActivity() + ) + activeRecyclerView = view.findViewById(R.id.recyclerviewactivedownloads) + activeRecyclerView?.layoutManager = LinearLayoutManager(context) + activeRecyclerView?.adapter = downloadsAdapter + + queuedDownloadsAdapter = + QueuedDownloadAdapter( + this, + requireActivity() + ) + othersRecyclerView = view.findViewById(R.id.recyclerviewotherdownloads) + othersRecyclerView?.layoutManager = LinearLayoutManager(context) + othersRecyclerView?.adapter = queuedDownloadsAdapter + + noResults?.visibility = GONE + shimmerCards?.visibility = GONE + + + downloadViewModel = ViewModelProvider(this)[DownloadViewModel::class.java] + downloadViewModel.activeDownloads.observe(viewLifecycleOwner){ + // update active + } + downloadViewModel.queuedDownloads.observe(viewLifecycleOwner){ + // update queued + } + } + + fun scrollToTop() { + activeRecyclerView!!.scrollToPosition(0) + Handler(Looper.getMainLooper()).post { + (topAppBar!!.parent as AppBarLayout).setExpanded( + true, + true + ) + } + } + + override fun onLongClick(v: View): Boolean { + val id = v.id + if (id == R.id.bottom_sheet_link) { + copyLinkToClipBoard(v.tag as Long) + return true + } + return false + } + + private fun removeSelectedItems() { +// if (bottomSheet != null) bottomSheet!!.hide() +// val deleteFile = booleanArrayOf(false) +// val deleteDialog = MaterialAlertDialogBuilder(fragmentContext!!) +// deleteDialog.setTitle(getString(R.string.you_are_going_to_delete_multiple_items)) +// deleteDialog.setMultiChoiceItems( +// arrayOf(getString(R.string.delete_files_too)), +// booleanArrayOf(false) +// ) { _: DialogInterface?, _: Int, b: Boolean -> deleteFile[0] = b } +// deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } +// deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> +// for (item in selectedObjects!!){ +// historyViewModel.delete(item, deleteFile[0]) +// } +// selectedObjects = ArrayList() +// historyAdapter!!.clearCheckeditems() +// deleteFab!!.visibility = GONE +// } +// deleteDialog.show() + } + + private fun removeItem(id: Long) { +// if (bottomSheet != null) bottomSheet!!.hide() +// val deleteFile = booleanArrayOf(false) +// val v = findItem(id) +// val deleteDialog = MaterialAlertDialogBuilder(fragmentContext!!) +// deleteDialog.setTitle(getString(R.string.you_are_going_to_delete) + " \"" + v!!.title + "\"!") +// deleteDialog.setMultiChoiceItems( +// arrayOf(getString(R.string.delete_file_too)), +// booleanArrayOf(false) +// ) { _: DialogInterface?, _: Int, b: Boolean -> deleteFile[0] = b } +// deleteDialog.setNegativeButton(getString(R.string.cancel)) { dialogInterface: DialogInterface, _: Int -> dialogInterface.cancel() } +// deleteDialog.setPositiveButton(getString(R.string.ok)) { _: DialogInterface?, _: Int -> +// historyViewModel.delete(v, deleteFile[0]) +// } +// deleteDialog.show() + } + + private fun copyLinkToClipBoard(id: Long) { + val url = findItem(id)?.url + val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText(getString(R.string.url), url) + clipboard.setPrimaryClip(clip) + if (bottomSheet != null) bottomSheet!!.hide() + Toast.makeText(context, getString(R.string.link_copied_to_clipboard), Toast.LENGTH_SHORT) + .show() + } + + private fun openLinkIntent(id: Long) { + val url = findItem(id)?.url + val i = Intent(Intent.ACTION_VIEW) + i.data = Uri.parse(url) + if (bottomSheet != null) bottomSheet!!.hide() + startActivity(i) + } + + private fun openFileIntent(id: Long) { + val downloadPath = findItem(id)!!.downloadPath + val file = File(downloadPath) + val uri = FileProvider.getUriForFile( + fragmentContext!!, + fragmentContext!!.packageName + ".fileprovider", + file + ) + val mime = mainActivity!!.contentResolver.getType(uri) + val i = Intent(Intent.ACTION_VIEW) + i.setDataAndType(uri, mime) + i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + startActivity(i) + } + + override fun onCardClick(videoID: Long, isPresent: Boolean) { + bottomSheet = BottomSheetDialog(fragmentContext!!) + bottomSheet!!.requestWindowFeature(Window.FEATURE_NO_TITLE) + bottomSheet!!.setContentView(R.layout.history_item_details_bottom_sheet) + val video = findItem(videoID) + val title = bottomSheet!!.findViewById(R.id.bottom_sheet_title) + title!!.text = video!!.title + val author = bottomSheet!!.findViewById(R.id.bottom_sheet_author) + author!!.text = video.author + val link = bottomSheet!!.findViewById