<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SimpleDownloader</title>
    <description>The latest articles on DEV Community by SimpleDownloader (simpledownloader).</description>
    <link>https://dev.to/simpledownloader</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F14370%2F28398289-c26a-4b59-ada9-64ad2a44ad02.jpg</url>
      <title>DEV Community: SimpleDownloader</title>
      <link>https://dev.to/simpledownloader</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simpledownloader"/>
    <language>en</language>
    <item>
      <title>SimpleDownloader release v1.0.2</title>
      <dc:creator>Jeetarc</dc:creator>
      <pubDate>Thu, 08 Oct 2026 06:50:19 +0000</pubDate>
      <link>https://dev.to/simpledownloader/simpledownloader-release-v102-1h49</link>
      <guid>https://dev.to/simpledownloader/simpledownloader-release-v102-1h49</guid>
      <description>&lt;h2&gt;
  
  
  v1.0.2
&lt;/h2&gt;

&lt;p&gt;Improved pause and concurrency handling, better restore behavior, notifications, foreground service management, and HTTP response handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Added
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;.setHoldSlotOnPause(boolean enable)&lt;/code&gt; to control whether a paused download holds or releases its concurrency slot.
Can be configured via &lt;code&gt;SimpleDownloader.builder()&lt;/code&gt; or a &lt;code&gt;downloader&lt;/code&gt; instance.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;.hasListeners()&lt;/code&gt; and &lt;code&gt;.hasListener(Listener)&lt;/code&gt; methods to both &lt;code&gt;DownloadTask&lt;/code&gt; and &lt;code&gt;SimpleDownloader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;.hasObservers()&lt;/code&gt; and &lt;code&gt;.hasObserver(Observer)&lt;/code&gt; methods to &lt;code&gt;SimpleDownloader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expanded &lt;code&gt;Status&lt;/code&gt; with helper methods - &lt;code&gt;isQueued()&lt;/code&gt;, &lt;code&gt;isPaused()&lt;/code&gt;, &lt;code&gt;isComplete()&lt;/code&gt;, &lt;code&gt;isFailed()&lt;/code&gt;, &lt;code&gt;isCancelled()&lt;/code&gt;, and more.&lt;/li&gt;
&lt;li&gt;Auto-restore is now enabled by default, disable it by calling &lt;code&gt;.setAutoRestore(false)&lt;/code&gt; via &lt;code&gt;SimpleDownloader.builder()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;Formatter.formatTime(long timeMillis, String format)&lt;/code&gt; for timestamp formatting.&lt;/li&gt;
&lt;li&gt;You can now get the current library version by using &lt;code&gt;SimpleDownloader.VERSION&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Improved restore behavior when automatic restore is disabled.&lt;/li&gt;
&lt;li&gt;Improved pause, concurrency-slot, and notification handling with &lt;code&gt;holdSlotOnPause&lt;/code&gt;.
Paused downloads now release their concurrency slot by default. &lt;code&gt;holdSlotOnPause&lt;/code&gt; is disabled by default.&lt;/li&gt;
&lt;li&gt;Improved notification grouping, ongoing notification state, and foreground service handling.&lt;/li&gt;
&lt;li&gt;Improved &lt;code&gt;Content-Range&lt;/code&gt; and response handling in the HTTP engine.&lt;/li&gt;
&lt;li&gt;Improved timeout client caching in the HTTP engine.&lt;/li&gt;
&lt;li&gt;Fixed waiting for network state execution ordering that was blocking queued submissions.&lt;/li&gt;
&lt;li&gt;Finalized the Listener API, removed deprecated callback signatures from both &lt;code&gt;DownloadTask.Listener&lt;/code&gt; and &lt;code&gt;SimpleDownloader.Listener&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Renamed the library package from &lt;code&gt;com.jeet.simpledownloader&lt;/code&gt; to &lt;code&gt;com.jeetarc.simpledownloader&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;General cleanup and improvements.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Package Rename&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The library package has been renamed to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.jeetarc.simpledownloader&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update any existing imports from &lt;code&gt;com.jeet.simpledownloader&lt;/code&gt; to &lt;code&gt;com.jeetarc.simpledownloader&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Update Dependency&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"com.github.jeetarc:SimpleDownloader:1.0.2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Listener API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are using deprecated Listener callback methods, update them to the new Listener API signatures. Visit &lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md#callbacks-and-listeners" rel="noopener noreferrer"&gt;Callbacks and Listener&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;br&gt;
&lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader/blob/main/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Releases:&lt;br&gt;
&lt;a href="https://github.com/jeetarc/SimpleDownloader/releases" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader/releases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SimpleDownloader on GitHub:&lt;br&gt;
&lt;a href="https://github.com/jeetarc/SimpleDownloader" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>downloader</category>
      <category>opensource</category>
      <category>library</category>
    </item>
    <item>
      <title>SimpleDownloader v1.0.0</title>
      <dc:creator>Jeetarc</dc:creator>
      <pubDate>Tue, 08 Sep 2026 12:43:41 +0000</pubDate>
      <link>https://dev.to/simpledownloader/simpledownloader-v100-47km</link>
      <guid>https://dev.to/simpledownloader/simpledownloader-v100-47km</guid>
      <description>&lt;h2&gt;
  
  
  v1.0.0
&lt;/h2&gt;

&lt;p&gt;Stable release of SimpleDownloader with a cleaner API, improved task management, and many more.&lt;/p&gt;

&lt;h3&gt;
  
  
  Added
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multi-download management&lt;/li&gt;
&lt;li&gt;Instance-based downloader API with &lt;code&gt;SimpleDownloader.getInstance(context)&lt;/code&gt; and &lt;code&gt;SimpleDownloader.builder(context)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DownloadRequest&lt;/code&gt; API for defining individual downloads separately from downloader configuration.&lt;/li&gt;
&lt;li&gt;Downloader ownership through &lt;code&gt;ownerId&lt;/code&gt;, if not set, it use library default: &lt;code&gt;"default_owner"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Added support for batch downloads and clearer separation between global downloader settings and per download options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fixes &amp;amp; Improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Safer task management when multiple downloader instances are used.&lt;/li&gt;
&lt;li&gt;Improved separation of task state, queues, and concurrency between downloader instances.&lt;/li&gt;
&lt;li&gt;Improved database handling and task ownership.&lt;/li&gt;
&lt;li&gt;General stability and lifecycle improvements for the stable release.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Migration for beta users
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Update the dependency:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"com.github.jeetarc:SimpleDownloader:1.0.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Replace the old download API:
&lt;/h4&gt;

&lt;p&gt;Beta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;DownloadTask&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOutput&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folderUri&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setFileUrl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startDownload&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;DownloadRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DownloadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folderUri&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileUrl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;DownloadTask&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startDownload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use &lt;code&gt;SimpleDownloader.builder(context)&lt;/code&gt; and &lt;code&gt;DownloadRequest.builder()&lt;/code&gt; for more controls. &lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md" rel="noopener noreferrer"&gt;Read APIs&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Update listeners:
&lt;/h4&gt;

&lt;p&gt;Move from the beta listener API to the stable APIs:&lt;/p&gt;

&lt;p&gt;Beta: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DownloadListener&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DownloadTask.Listener&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SimpleDownloader.Listener&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. Read README for more:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader/blob/main/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SimpleDownloader on GitHub:&lt;br&gt;
&lt;a href="https://github.com/jeetarc/SimpleDownloader" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader&lt;/a&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>downloader</category>
      <category>opensource</category>
      <category>simpledownloader</category>
    </item>
    <item>
      <title>SimpleDownloader - a modern Android file downloader library designed to simplify complex download management</title>
      <dc:creator>Jeetarc</dc:creator>
      <pubDate>Tue, 18 Aug 2026 04:48:49 +0000</pubDate>
      <link>https://dev.to/simpledownloader/simpledownloader-an-android-downloader-manager-library-designed-to-simplify-complex-file-3hpl</link>
      <guid>https://dev.to/simpledownloader/simpledownloader-an-android-downloader-manager-library-designed-to-simplify-complex-file-3hpl</guid>
      <description>&lt;p&gt;Downloading files on Android is a headache. You have to deal with file systems, scoped storage, MediaStore, foreground, notifications, lifecycle handling, retries, etc along with optimizations.&lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;SimpleDownloader&lt;/strong&gt; - a simple to use library for everything from basic file downloads to advanced download management system.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple downloader profiles in a single app&lt;/li&gt;
&lt;li&gt;Queues, priorities, and concurrency control&lt;/li&gt;
&lt;li&gt;Pause, resume, cancel, retry, remove, requeue, and force download&lt;/li&gt;
&lt;li&gt;Network loss handling + Wi-Fi-only mode&lt;/li&gt;
&lt;li&gt;Database persistence and automatic restore&lt;/li&gt;
&lt;li&gt;Filesystem paths, SAF/Document Tree, and MediaStore&lt;/li&gt;
&lt;li&gt;Automatic filename and MIME type handling&lt;/li&gt;
&lt;li&gt;Progress, speed, ETA, status, and lifecycle callbacks&lt;/li&gt;
&lt;li&gt;Foreground + progress/complete/error notifications, with actions and thumbnails&lt;/li&gt;
&lt;li&gt;Custom OkHttpClient, headers, cookies, checksums, RetryPolicy, timeouts, and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minimum Android version API 21 (Android 5.0). The below examples are written in Java, the library can be used from both Java and Kotlin.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Add JitPack to your repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="n"&gt;dependencyResolutionManagement&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;repositoriesMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RepositoriesMode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FAIL_ON_PROJECT_REPOS&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;maven&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="s2"&gt;"https://jitpack.io"&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight gradle"&gt;&lt;code&gt;&lt;span class="k"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="s2"&gt;"com.github.jeetarc:SimpleDownloader:&amp;lt;latest-version&amp;gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visit Releases page to know latest version:&lt;br&gt;
&lt;a href="https://github.com/jeetarc/SimpleDownloader/releases" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader/releases&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Get the default instance&lt;/span&gt;
&lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Or create a customized instance&lt;/span&gt;
&lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SimpleDownloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Builder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMaxConcurrent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRetryCount&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enableHistory&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enableForeground&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setAutoRestore&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Filesystem path&lt;/span&gt;
&lt;span class="nc"&gt;DownloadRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DownloadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folderPath&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileUrl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;DownloadTask&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startDownload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// MediaStore (Android 10+)&lt;/span&gt;
&lt;span class="nc"&gt;DownloadRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DownloadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Downloads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXTERNAL_CONTENT_URI&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileUrl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;DownloadTask&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startDownload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// SAF / Document Tree&lt;/span&gt;
&lt;span class="nc"&gt;DownloadRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DownloadRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;treeUri&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FileName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AUTO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fileUrl&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="nc"&gt;DownloadTask&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;downloader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startDownload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API also gives callbacks for pause, resume, progress, completion, errors, status changes, lifecycle events, etc. &lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md#callbacks-and-listeners" rel="noopener noreferrer"&gt;Callbacks and Listeners&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Permissions
&lt;/h3&gt;

&lt;p&gt;Only request what you use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;POST_NOTIFICATIONS&lt;/code&gt; for notifications (runtime permission on Android 13+)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FOREGROUND_SERVICE&lt;/code&gt; + &lt;code&gt;FOREGROUND_SERVICE_DATA_SYNC&lt;/code&gt; when using foreground mode&lt;/li&gt;
&lt;li&gt;Storage permissions only when writing to external filesystem paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No storage permission is needed for app-specific directories, MediaStore, or SAF. &lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md#Setup" rel="noopener noreferrer"&gt;Setup guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many more APIs, customization and control available, view README for more: &lt;a href="https://github.com/jeetarc/SimpleDownloader/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader/blob/main/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/jeetarc/SimpleDownloader" rel="noopener noreferrer"&gt;https://github.com/jeetarc/SimpleDownloader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit community: &lt;a href="https://www.reddit.com/r/SimpleDownloader" rel="noopener noreferrer"&gt;https://www.reddit.com/r/SimpleDownloader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback, especially if you've dealing with Android's download/storage APIs before.&lt;/p&gt;

</description>
      <category>android</category>
      <category>downloader</category>
      <category>java</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
