private fun loadSampleVideos() { // Sample public domain/Creative Commons video URLs for testing val samples = listOf( SampleVideo("Sample 1 - Big Buck Bunny", "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"), SampleVideo("Sample 2 - For Bigger Blazes", "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4"), SampleVideo("Sample 3 - For Bigger Funrides", "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFunrides.mp4") ) // Display samples in RecyclerView (simplified - add to a list) binding.samplesContainer.removeAllViews() samples.forEach { sample -> val button = com.google.android.material.button.MaterialButton(this).apply { text = sample.name layoutParams = android.view.ViewGroup.LayoutParams( android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT ) setOnClickListener { binding.etUrl.setText(sample.url) binding.etFileName.setText(sample.name.replace(" ", "_").lowercase()) } } binding.samplesContainer.addView(button) } }
override fun onDestroy() { super.onDestroy() if (isBound) { unbindService(connection) isBound = false } } download 4k video from youtube android
override fun onDestroy() { super.onDestroy() serviceScope.cancel() } } // MainActivity.kt import android.Manifest import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.ServiceConnection import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle import android.os.IBuilder import android.os.IBinder import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { private var downloadService: VideoDownloaderService? = null private var isBound = false SampleVideo("Sample 2 - For Bigger Blazes"
private fun openDownloadsFolder() { val downloadsDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS) val intent = Intent(Intent.ACTION_VIEW).apply { setDataAndType(Uri.fromFile(downloadsDir), "resource/folder") addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } startActivity(Intent.createChooser(intent, "Open Downloads")) } SampleVideo("Sample 3 - For Bigger Funrides"
<com.google.android.material.button.MaterialButton android:id="@+id/btnOpenDownloads" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:text="Open Downloads" style="@style/Widget.MaterialComponents.Button.OutlinedButton" />
private val connection = object : ServiceConnection { override fun onServiceConnected(name: ComponentName?, service: IBinder?) { val binder = service as VideoDownloaderService.DownloadBinder downloadService = binder.getService() isBound = true } override fun onServiceDisconnected(name: ComponentName?) { isBound = false downloadService = null } }