Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate common from SharedPreferences to DataStore #6801

Open
wants to merge 20 commits into
base: main
Choose a base branch
from

Conversation

daymxn
Copy link
Member

@daymxn daymxn commented Mar 24, 2025

Temp CL to see Health Metrics

@daymxn daymxn self-assigned this Mar 24, 2025
Copy link
Contributor

github-actions bot commented Mar 24, 2025

Javadoc Changes:
--- /home/runner/diff/original/firebase-kotlindoc/android/client/firebase-common/_toc.yaml	2025-04-10 21:07:58.952608597 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/android/client/firebase-common/_toc.yaml	2025-04-10 21:04:43.087597796 +0000
@@ -27,6 +27,18 @@
     - title: "FirebaseTooManyRequestsException"
       path: "/docs/reference/android/com/google/firebase/FirebaseTooManyRequestsException.html"
 
+- title: "firebase.datastore"
+  path: "/docs/reference/android/com/google/firebase/datastore/package-summary.html"
+
+  section:
+  - title: "Classes"
+
+    section:
+    - title: "DataStorage"
+      path: "/docs/reference/android/com/google/firebase/datastore/DataStorage.html"
+    - title: "DataStoreKt"
+      path: "/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html"
+
 - title: "firebase.ktx"
   status: deprecated
   path: "/docs/reference/android/com/google/firebase/ktx/package-summary.html"
--- /home/runner/diff/original/firebase-kotlindoc/android/com/google/firebase/datastore/DataStorage.html	1970-01-01 00:00:00.000000000 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/android/com/google/firebase/datastore/DataStorage.html	2025-04-10 21:04:43.093597765 +0000
@@ -0,0 +1,409 @@
+<html devsite="true">
+  <head>
+    <title>DataStorage</title>
+{% setvar book_path %}/_book.yaml{% endsetvar %}
+{% include "docs/reference/android/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <div id="metadata-info-block"></div>
+    <h1>DataStorage</h1>
+    <p>
+      <pre>public final class <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html">DataStorage</a></pre>
+    </p>
+    <hr>
+    <p>Wrapper around <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> for easier migration from <code>SharedPreferences</code> in Java code.</p>
+    <p>Automatically migrates data from any <code>SharedPreferences</code> that share the same context and name.</p>
+    <p>There should only ever be <em>one</em> instance of this class per context and name variant.</p>
+    <blockquote>
+      <p>Do <b>NOT</b> use this <em>unless</em> you're bridging Java code. If you're writing new code, or your code is in Kotlin, then you should create your own singleton that uses <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> directly.</p>
+    </blockquote>
+    <p>Example:</p>
+    <pre class="prettyprint">DataStorage heartBeatStorage = new DataStorage(applicationContext, &quot;FirebaseHeartBeat&quot;);</pre>
+    <h2>Summary</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public fields</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#context()">context</a></code></div>
+              <p>The <code><a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code> that this data will be saved under.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/String.html">String</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#name()">name</a></code></div>
+              <p>What the storage file should be named.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public constructors</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td>
+              <div><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#DataStorage(android.content.Context,kotlin.String)">DataStorage</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a>&nbsp;context,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/String.html">String</a>&nbsp;name)</code></div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public methods</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td><code>final boolean</code></td>
+            <td>
+              <div><code>&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#contains(androidx.datastore.preferences.core.Preferences.Key)">contains</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key)</code></div>
+              <p>Checks if a key is present in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> Function1&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a>&gt;&nbsp;transform)</code></div>
+              <p>Transactionally edit data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/util/Map.html">Map</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> ?&gt;,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt;</code></td>
+            <td>
+              <div><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#getAllSync()">getAllSync</a>()</code></div>
+              <p>Gets all data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T</code></td>
+            <td>
+              <div><code>&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue<br>)</code></div>
+              <p>Get data from the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+            <td>
+              <div><code>&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;value)</code></div>
+              <p>Sets and saves data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="list">
+      <h2>Public fields</h2>
+      <div class="api-item"><a name="getContext()"></a><a name="setContext()"></a><a name="getContext--"></a><a name="setContext--"></a>
+        <h3 class="api-name" id="context()">context</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a>&nbsp;<a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#context()">context</a></pre>
+        <p>The <code><a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code> that this data will be saved under.</p>
+      </div>
+      <div class="api-item"><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
+        <h3 class="api-name" id="name()">name</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/String.html">String</a>&nbsp;<a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#name()">name</a></pre>
+        <p>What the storage file should be named.</p>
+      </div>
+    </div>
+    <div class="list">
+      <h2>Public constructors</h2>
+      <div class="api-item"><a name="DataStorage(android.content.Context, kotlin.String)"></a><a name="DataStorage-android.content.Context-kotlin.String-"></a><a name="datastorage"></a>
+        <h3 class="api-name" id="DataStorage(android.content.Context,kotlin.String)">DataStorage</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;<a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#DataStorage(android.content.Context,kotlin.String)">DataStorage</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a>&nbsp;context,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/String.html">String</a>&nbsp;name)</pre>
+      </div>
+    </div>
+    <div class="list">
+      <h2>Public methods</h2>
+      <div class="api-item"><a name="contains-androidx.datastore.preferences.core.Preferences.Key-"></a><a name="contains"></a>
+        <h3 class="api-name" id="contains(androidx.datastore.preferences.core.Preferences.Key)">contains</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;boolean&nbsp;&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#contains(androidx.datastore.preferences.core.Preferences.Key)">contains</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key)</pre>
+        <p>Checks if a key is present in the datastore <em>synchronously</em>.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">Preferences.Key&lt;Long&gt; fireCountKey = PreferencesKeys.longKey(&quot;fire-count&quot;);<br>assert !dataStore.contains(fireCountKey);<br><br>dataStore.putSync(fireCountKey, 102L);<br>assert dataStore.contains(fireCountKey);</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key</code></td>
+                <td>
+                  <p>The typed key of the entry to find.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="editSync-kotlin.Function1-"></a><a name="editsync"></a>
+        <h3 class="api-name" id="editSync(kotlin.Function1)">editSync</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>&nbsp;<a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> Function1&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a>&gt;&nbsp;transform)</pre>
+        <p>Transactionally edit data in the datastore <em>synchronously</em>.</p>
+        <p>Edits made within the <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> callback will be saved (committed) all at once once the <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block exits.</p>
+        <p>Because of the blocking nature of this function, you should <em>never</em> call <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> within an already running <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block. Since this can cause a deadlock, <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> will instead throw an exception if it's caught.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">dataStore.editSync((pref) -&gt; {<br>  Long heartBeatCount = pref.get(HEART_BEAT_COUNT_TAG);<br>  if (heartBeatCount == null || heartBeatCount 30) {<br>    heartBeatCount = 0L;<br>  }<br>  pref.set(HEART_BEAT_COUNT_TAG, heartBeatCount);<br>  pref.set(LAST_STORED_DATE, &quot;1970-0-1&quot;);<br><br>  return null;<br>});</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> Function1&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a>&gt;&nbsp;transform</code></td>
+                <td>
+                  <p>A callback to invoke with the <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a></code> object.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+                <td>
+                  <p>The <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object that the data was saved under.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Throws</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-illegal-state-exception/index.html">kotlin.IllegalStateException</a>&nbsp;kotlin.IllegalStateException</code></td>
+                <td>
+                  <p>If you attempt to call <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> within another <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">See also</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="/docs/reference/android/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a></code></td>
+                <td></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="getAllSync--"></a><a name="getallsync"></a>
+        <h3 class="api-name" id="getAllSync()">getAllSync</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/util/Map.html">Map</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> ?&gt;,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt;&nbsp;<a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#getAllSync()">getAllSync</a>()</pre>
+        <p>Gets all data in the datastore <em>synchronously</em>.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">ArrayList&lt;String&gt; allDates = new ArrayList&lt;&gt;();<br><br>for (Map.Entry&lt;Preferences.Key&lt;?&gt;, Object&gt; entry : dataStore.getAllSync().entrySet()) {<br>  if (entry.getValue() instanceof Set) {<br>    Set&lt;String&gt; dates = new HashSet&lt;&gt;((Set&lt;String&gt;) entry.getValue());<br>    if (!dates.isEmpty()) {<br>      allDates.add(new ArrayList&lt;&gt;(dates));<br>    }<br>  }<br>}</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/util/Map.html">Map</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> ?&gt;,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt;</code></td>
+                <td>
+                  <p>An <em>immutable</em> map of data currently present in the datastore.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="getSync(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="getSync-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="getsync"></a>
+        <h3 class="api-name" id="getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue<br>)</pre>
+        <p>Get data from the datastore <em>synchronously</em>.</p>
+        <p>Note that if the key is <em>not</em> in the datastore, while the <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">defaultValue</a></code> will be returned instead- it will <b>not</b> be saved to the datastore; you'll have to manually do that.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">Preferences.Key&lt;Long&gt; fireCountKey = PreferencesKeys.longKey(&quot;fire-count&quot;);<br>assert dataStore.get(fireCountKey, 0L) == 0L;<br><br>dataStore.putSync(fireCountKey, 102L);<br>assert dataStore.get(fireCountKey, 0L) == 102L;</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key</code></td>
+                <td>
+                  <p>The typed key of the entry to get data for.</p>
+                </td>
+              </tr>
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue</code></td>
+                <td>
+                  <p>A value to default to, if the key isn't found.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">See also</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="/docs/reference/android/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a></code></td>
+                <td></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="putSync(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="putSync-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="putsync"></a>
+        <h3 class="api-name" id="putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>&nbsp;&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</a>(@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;value)</pre>
+        <p>Sets and saves data in the datastore <em>synchronously</em>.</p>
+        <p>Existing values will be overwritten.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">dataStore.putSync(PreferencesKeys.longKey(&quot;fire-count&quot;), 102L);</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key</code></td>
+                <td>
+                  <p>The typed key of the entry to save the data under.</p>
+                </td>
+              </tr>
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;value</code></td>
+                <td>
+                  <p>The data to save.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+                <td>
+                  <p>The <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object that the data was saved under.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </div>
+  </body>
+</html>
+
--- /home/runner/diff/original/firebase-kotlindoc/android/com/google/firebase/datastore/DataStoreKt.html	1970-01-01 00:00:00.000000000 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/android/com/google/firebase/datastore/DataStoreKt.html	2025-04-10 21:04:43.093597765 +0000
@@ -0,0 +1,81 @@
+<html devsite="true">
+  <head>
+    <title>DataStoreKt</title>
+{% setvar book_path %}/_book.yaml{% endsetvar %}
+{% include "docs/reference/android/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>DataStoreKt</h1>
+    <p>
+      <pre>public final class <a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html">DataStoreKt</a></pre>
+    </p>
+    <hr>
+    <h2>Summary</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public methods</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td><code>static&nbsp;final @<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T</code></td>
+            <td>
+              <div><code>&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html">DataStoreKt</a>.<a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>&nbsp;receiver,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue<br>)</code></div>
+              <p>Helper method for getting the value out of a <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object if it exists, else falling back to the default value.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="list">
+      <h2>Public methods</h2>
+      <div class="api-item"><a name="(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="-androidx.datastore.preferences.core.Preferences-.getOrDefault-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="getordefault"></a>
+        <h3 class="api-name" id="(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">DataStoreKt.getOrDefault</h3>
+        <pre class="api-signature no-pretty-print">public&nbsp;static&nbsp;final&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;&lt;T&nbsp;extends&nbsp;<a href="https://developer.android.com/reference/kotlin/java/lang/Object.html">Object</a>&gt; <a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html">DataStoreKt</a>.<a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>&nbsp;receiver,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key,<br>&nbsp;&nbsp;&nbsp;&nbsp;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue<br>)</pre>
+        <p>Helper method for getting the value out of a <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object if it exists, else falling back to the default value.</p>
+        <p>This is primarily useful when working with an instance of <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a></code></p>
+        <ul>
+          <li>
+            <p>like when working within an <code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">DataStorage.editSync</a></code> callback.</p>
+          </li>
+        </ul>
+        <p>Example:</p>
+        <pre class="prettyprint">dataStore.editSync((pref) -&gt; {<br> long heartBeatCount = DataStoreKt.getOrDefault(pref, HEART_BEAT_COUNT_TAG, 0L);<br> heartBeatCount+=1;<br> pref.set(HEART_BEAT_COUNT_TAG, heartBeatCount);<br><br> return null;<br>});</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&gt;&nbsp;key</code></td>
+                <td>
+                  <p>The typed key of the entry to get data for.</p>
+                </td>
+              </tr>
+              <tr>
+                <td><code>@<a href="https://developer.android.com/reference/kotlin/androidx/annotation/NonNull.html">NonNull</a> T&nbsp;defaultValue</code></td>
+                <td>
+                  <p>A value to default to, if the key isn't found.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </div>
+  </body>
+</html>
+
--- /home/runner/diff/original/firebase-kotlindoc/android/com/google/firebase/datastore/package-summary.html	1970-01-01 00:00:00.000000000 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/android/com/google/firebase/datastore/package-summary.html	2025-04-10 21:04:43.090597781 +0000
@@ -0,0 +1,32 @@
+<html devsite="true">
+  <head>
+    <title>com.google.firebase.datastore</title>
+{% setvar book_path %}/_book.yaml{% endsetvar %}
+{% include "docs/reference/android/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>com.google.firebase.datastore</h1>
+    <h2>Classes</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <tbody class="list">
+          <tr>
+            <td><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStorage.html">DataStorage</a></code></td>
+            <td>
+              <p>Wrapper around <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> for easier migration from <code>SharedPreferences</code> in Java code.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code><a href="/docs/reference/android/com/google/firebase/datastore/DataStoreKt.html">DataStoreKt</a></code></td>
+            <td></td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+  </body>
+</html>
+
--- /home/runner/diff/original/firebase-kotlindoc/kotlin/client/firebase-common/_toc.yaml	2025-04-10 21:07:58.948608615 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/kotlin/client/firebase-common/_toc.yaml	2025-04-10 21:04:43.081597827 +0000
@@ -29,6 +29,16 @@
     - title: "Firebase"
       path: "/docs/reference/kotlin/com/google/firebase/Firebase.html"
 
+- title: "firebase.datastore"
+  path: "/docs/reference/kotlin/com/google/firebase/datastore/package-summary.html"
+
+  section:
+  - title: "Classes"
+
+    section:
+    - title: "DataStorage"
+      path: "/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html"
+
 - title: "firebase.ktx"
   status: deprecated
   path: "/docs/reference/kotlin/com/google/firebase/ktx/package-summary.html"
--- /home/runner/diff/original/firebase-kotlindoc/kotlin/com/google/firebase/datastore/DataStorage.html	1970-01-01 00:00:00.000000000 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/kotlin/com/google/firebase/datastore/DataStorage.html	2025-04-10 21:04:43.083597817 +0000
@@ -0,0 +1,409 @@
+<html devsite="true">
+  <head>
+    <title>DataStorage</title>
+{% setvar book_path %}/_book.yaml{% endsetvar %}
+{% include "docs/reference/kotlin/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <div id="metadata-info-block"></div>
+    <h1>DataStorage</h1>
+    <p>
+      <pre>class <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html">DataStorage</a></pre>
+    </p>
+    <hr>
+    <p>Wrapper around <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> for easier migration from <code>SharedPreferences</code> in Java code.</p>
+    <p>Automatically migrates data from any <code>SharedPreferences</code> that share the same context and name.</p>
+    <p>There should only ever be <em>one</em> instance of this class per context and name variant.</p>
+    <blockquote>
+      <p>Do <b>NOT</b> use this <em>unless</em> you're bridging Java code. If you're writing new code, or your code is in Kotlin, then you should create your own singleton that uses <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> directly.</p>
+    </blockquote>
+    <p>Example:</p>
+    <pre class="prettyprint">DataStorage heartBeatStorage = new DataStorage(applicationContext, &quot;FirebaseHeartBeat&quot;);</pre>
+    <h2>Summary</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public constructors</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td>
+              <div><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#DataStorage(android.content.Context,kotlin.String)">DataStorage</a>(context:&nbsp;<a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a>,&nbsp;name:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a>)</code></div>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public functions</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td><code><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html">Boolean</a></code></td>
+            <td>
+              <div><code>&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#contains(androidx.datastore.preferences.core.Preferences.Key)">contains</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;)</code></div>
+              <p>Checks if a key is present in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a>(transform:&nbsp;(<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>) <span style="white-space: nowrap;">-&gt;</span> <a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a>)</code></div>
+              <p>Transactionally edit data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html">Map</a>&lt;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;*&gt;,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>&gt;</code></td>
+            <td>
+              <div><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#getAllSync()">getAllSync</a>()</code></div>
+              <p>Gets all data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code>T</code></td>
+            <td>
+              <div><code>&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;defaultValue:&nbsp;T)</code></div>
+              <p>Get data from the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+            <td>
+              <div><code>&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;value:&nbsp;T)</code></div>
+              <p>Sets and saves data in the datastore <em>synchronously</em>.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <thead>
+          <tr>
+            <th colspan="100%"><h3>Public properties</h3></th>
+          </tr>
+        </thead>
+        <tbody class="list">
+          <tr>
+            <td><code><a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#context()">context</a></code></div>
+              <p>The <code><a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code> that this data will be saved under.</p>
+            </td>
+          </tr>
+          <tr>
+            <td><code><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a></code></td>
+            <td>
+              <div><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#name()">name</a></code></div>
+              <p>What the storage file should be named.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <div class="list">
+      <h2>Public constructors</h2>
+      <div class="api-item"><a name="DataStorage(android.content.Context, kotlin.String)"></a><a name="DataStorage-android.content.Context-kotlin.String-"></a><a name="datastorage"></a>
+        <h3 class="api-name" id="DataStorage(android.content.Context,kotlin.String)">DataStorage</h3>
+        <pre class="api-signature no-pretty-print"><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#DataStorage(android.content.Context,kotlin.String)">DataStorage</a>(context:&nbsp;<a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a>,&nbsp;name:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a>)</pre>
+      </div>
+    </div>
+    <div class="list">
+      <h2>Public functions</h2>
+      <div class="api-item"><a name="contains-androidx.datastore.preferences.core.Preferences.Key-"></a><a name="contains"></a>
+        <h3 class="api-name" id="contains(androidx.datastore.preferences.core.Preferences.Key)">contains</h3>
+        <pre class="api-signature no-pretty-print">fun&nbsp;&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#contains(androidx.datastore.preferences.core.Preferences.Key)">contains</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;):&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-boolean/index.html">Boolean</a></pre>
+        <p>Checks if a key is present in the datastore <em>synchronously</em>.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">Preferences.Key&lt;Long&gt; fireCountKey = PreferencesKeys.longKey(&quot;fire-count&quot;);<br>assert !dataStore.contains(fireCountKey);<br><br>dataStore.putSync(fireCountKey, 102L);<br>assert dataStore.contains(fireCountKey);</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;</code></td>
+                <td>
+                  <p>The typed key of the entry to find.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="editSync-kotlin.Function1-"></a><a name="editsync"></a>
+        <h3 class="api-name" id="editSync(kotlin.Function1)">editSync</h3>
+        <pre class="api-signature no-pretty-print">fun&nbsp;<a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a>(transform:&nbsp;(<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>) <span style="white-space: nowrap;">-&gt;</span> <a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a>):&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></pre>
+        <p>Transactionally edit data in the datastore <em>synchronously</em>.</p>
+        <p>Edits made within the <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> callback will be saved (committed) all at once once the <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block exits.</p>
+        <p>Because of the blocking nature of this function, you should <em>never</em> call <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> within an already running <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block. Since this can cause a deadlock, <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> will instead throw an exception if it's caught.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">dataStore.editSync((pref) -&gt; {<br>  Long heartBeatCount = pref.get(HEART_BEAT_COUNT_TAG);<br>  if (heartBeatCount == null || heartBeatCount 30) {<br>    heartBeatCount = 0L;<br>  }<br>  pref.set(HEART_BEAT_COUNT_TAG, heartBeatCount);<br>  pref.set(LAST_STORED_DATE, &quot;1970-0-1&quot;);<br><br>  return null;<br>});</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>transform:&nbsp;(<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a>) <span style="white-space: nowrap;">-&gt;</span> <a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-unit/index.html">Unit</a></code></td>
+                <td>
+                  <p>A callback to invoke with the <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a></code> object.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+                <td>
+                  <p>The <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object that the data was saved under.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Throws</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>kotlin.IllegalStateException:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-illegal-state-exception/index.html">kotlin.IllegalStateException</a></code></td>
+                <td>
+                  <p>If you attempt to call <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">editSync</a></code> within another <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">transform</a></code> block.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">See also</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a></code></td>
+                <td></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="getAllSync--"></a><a name="getallsync"></a>
+        <h3 class="api-name" id="getAllSync()">getAllSync</h3>
+        <pre class="api-signature no-pretty-print">fun&nbsp;<a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#getAllSync()">getAllSync</a>():&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html">Map</a>&lt;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;*&gt;,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>&gt;</pre>
+        <p>Gets all data in the datastore <em>synchronously</em>.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">ArrayList&lt;String&gt; allDates = new ArrayList&lt;&gt;();<br><br>for (Map.Entry&lt;Preferences.Key&lt;?&gt;, Object&gt; entry : dataStore.getAllSync().entrySet()) {<br>  if (entry.getValue() instanceof Set) {<br>    Set&lt;String&gt; dates = new HashSet&lt;&gt;((Set&lt;String&gt;) entry.getValue());<br>    if (!dates.isEmpty()) {<br>      allDates.add(new ArrayList&lt;&gt;(dates));<br>    }<br>  }<br>}</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/index.html">Map</a>&lt;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;*&gt;,&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>&gt;</code></td>
+                <td>
+                  <p>An <em>immutable</em> map of data currently present in the datastore.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="getSync(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="getSync-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="getsync"></a>
+        <h3 class="api-name" id="getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</h3>
+        <pre class="api-signature no-pretty-print">fun&nbsp;&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getSync</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;defaultValue:&nbsp;T):&nbsp;T</pre>
+        <p>Get data from the datastore <em>synchronously</em>.</p>
+        <p>Note that if the key is <em>not</em> in the datastore, while the <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#getSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">defaultValue</a></code> will be returned instead- it will <b>not</b> be saved to the datastore; you'll have to manually do that.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">Preferences.Key&lt;Long&gt; fireCountKey = PreferencesKeys.longKey(&quot;fire-count&quot;);<br>assert dataStore.get(fireCountKey, 0L) == 0L;<br><br>dataStore.putSync(fireCountKey, 102L);<br>assert dataStore.get(fireCountKey, 0L) == 102L;</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;</code></td>
+                <td>
+                  <p>The typed key of the entry to get data for.</p>
+                </td>
+              </tr>
+              <tr>
+                <td><code>defaultValue:&nbsp;T</code></td>
+                <td>
+                  <p>A value to default to, if the key isn't found.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">See also</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a></code></td>
+                <td></td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+      <div class="api-item"><a name="putSync(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="putSync-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="putsync"></a>
+        <h3 class="api-name" id="putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</h3>
+        <pre class="api-signature no-pretty-print">fun&nbsp;&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#putSync(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">putSync</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;value:&nbsp;T):&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></pre>
+        <p>Sets and saves data in the datastore <em>synchronously</em>.</p>
+        <p>Existing values will be overwritten.</p>
+        <p>Blocks on the currently running thread.</p>
+        <p>Example:</p>
+        <pre class="prettyprint">dataStore.putSync(PreferencesKeys.longKey(&quot;fire-count&quot;), 102L);</pre>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Parameters</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code>key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;</code></td>
+                <td>
+                  <p>The typed key of the entry to save the data under.</p>
+                </td>
+              </tr>
+              <tr>
+                <td><code>value:&nbsp;T</code></td>
+                <td>
+                  <p>The data to save.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+        <div class="devsite-table-wrapper">
+          <table class="responsive">
+            <colgroup>
+              <col width="40%">
+              <col>
+            </colgroup>
+            <thead>
+              <tr>
+                <th colspan="100%">Returns</th>
+              </tr>
+            </thead>
+            <tbody class="list">
+              <tr>
+                <td><code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code></td>
+                <td>
+                  <p>The <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object that the data was saved under.</p>
+                </td>
+              </tr>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </div>
+    <div class="list">
+      <h2>Public properties</h2>
+      <div class="api-item"><a name="getContext()"></a><a name="setContext()"></a><a name="getContext--"></a><a name="setContext--"></a>
+        <h3 class="api-name" id="context()">context</h3>
+        <pre class="api-signature no-pretty-print">val&nbsp;<a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#context()">context</a>:&nbsp;<a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></pre>
+        <p>The <code><a href="https://developer.android.com/reference/kotlin/android/content/Context.html">Context</a></code> that this data will be saved under.</p>
+      </div>
+      <div class="api-item"><a name="getName()"></a><a name="setName()"></a><a name="getName--"></a><a name="setName--"></a>
+        <h3 class="api-name" id="name()">name</h3>
+        <pre class="api-signature no-pretty-print">val&nbsp;<a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#name()">name</a>:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html">String</a></pre>
+        <p>What the storage file should be named.</p>
+      </div>
+    </div>
+  </body>
+</html>
+
--- /home/runner/diff/original/firebase-kotlindoc/kotlin/com/google/firebase/datastore/package-summary.html	1970-01-01 00:00:00.000000000 +0000
+++ /home/runner/diff/modified/firebase-kotlindoc/kotlin/com/google/firebase/datastore/package-summary.html	2025-04-10 21:04:43.083597817 +0000
@@ -0,0 +1,87 @@
+<html devsite="true">
+  <head>
+    <title>com.google.firebase.datastore</title>
+{% setvar book_path %}/_book.yaml{% endsetvar %}
+{% include "docs/reference/kotlin/_reference-head-tags.html" %}
+  </head>
+  <body>
+    <h1>com.google.firebase.datastore</h1>
+    <h2>Classes</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <tbody class="list">
+          <tr>
+            <td><code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html">DataStorage</a></code></td>
+            <td>
+              <p>Wrapper around <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/core/DataStore.html">DataStore</a></code> for easier migration from <code>SharedPreferences</code> in Java code.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <h2>Extension functions summary</h2>
+    <div class="devsite-table-wrapper">
+      <table class="responsive">
+        <colgroup>
+          <col width="40%">
+          <col>
+        </colgroup>
+        <tbody class="list">
+          <tr>
+            <td><code>T</code></td>
+            <td>
+              <div><code>&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>.<a href="/docs/reference/kotlin/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;defaultValue:&nbsp;T)</code></div>
+              <p>Helper method for getting the value out of a <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object if it exists, else falling back to the default value.</p>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
+    <h2>Extension functions</h2>
+    <div class="api-item"><a name="(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key, kotlin.Any)"></a><a name="-androidx.datastore.preferences.core.Preferences-.getOrDefault-androidx.datastore.preferences.core.Preferences.Key-kotlin.Any-"></a><a name="getordefault"></a>
+      <h3 class="api-name" id="(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</h3>
+      <pre class="api-signature no-pretty-print">fun&nbsp;&lt;T&nbsp;:&nbsp;<a href="https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/index.html">Any</a>?&gt; <a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a>.<a href="/docs/reference/kotlin/com/google/firebase/datastore/package-summary.html#(androidx.datastore.preferences.core.Preferences).getOrDefault(androidx.datastore.preferences.core.Preferences.Key,kotlin.Any)">getOrDefault</a>(key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;,&nbsp;defaultValue:&nbsp;T):&nbsp;T</pre>
+      <p>Helper method for getting the value out of a <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.html">Preferences</a></code> object if it exists, else falling back to the default value.</p>
+      <p>This is primarily useful when working with an instance of <code><a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/MutablePreferences.html">MutablePreferences</a></code></p>
+      <ul>
+        <li>
+          <p>like when working within an <code><a href="/docs/reference/kotlin/com/google/firebase/datastore/DataStorage.html#editSync(kotlin.Function1)">DataStorage.editSync</a></code> callback.</p>
+        </li>
+      </ul>
+      <p>Example:</p>
+      <pre class="prettyprint">dataStore.editSync((pref) -&gt; {<br> long heartBeatCount = DataStoreKt.getOrDefault(pref, HEART_BEAT_COUNT_TAG, 0L);<br> heartBeatCount+=1;<br> pref.set(HEART_BEAT_COUNT_TAG, heartBeatCount);<br><br> return null;<br>});</pre>
+      <div class="devsite-table-wrapper">
+        <table class="responsive">
+          <colgroup>
+            <col width="40%">
+            <col>
+          </colgroup>
+          <thead>
+            <tr>
+              <th colspan="100%">Parameters</th>
+            </tr>
+          </thead>
+          <tbody class="list">
+            <tr>
+              <td><code>key:&nbsp;<a href="https://developer.android.com/reference/kotlin/androidx/datastore/preferences/core/Preferences.Key.html">Preferences.Key</a>&lt;T&gt;</code></td>
+              <td>
+                <p>The typed key of the entry to get data for.</p>
+              </td>
+            </tr>
+            <tr>
+              <td><code>defaultValue:&nbsp;T</code></td>
+              <td>
+                <p>A value to default to, if the key isn't found.</p>
+              </td>
+            </tr>
+          </tbody>
+        </table>
+      </div>
+    </div>
+  </body>
+</html>
+

@google-oss-bot
Copy link
Contributor

1 Warning
⚠️ Did you forget to add a changelog entry? (Add the 'no-changelog' label to the PR to silence this warning.)

Generated by 🚫 Danger

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Mar 24, 2025

Coverage Report 1

Affected Products

  • firebase-common

    Overall coverage changed from 52.66% (70c8e89) to 53.44% (18bd2ee) by +0.78%.

    FilenameBase (70c8e89)Merge (18bd2ee)Diff
    DataStore.kt?83.33%?
    HeartBeatInfoStorage.java93.23%93.98%+0.75%

Test Logs

  1. https://storage.googleapis.com/firebase-sdk-metric-reports/EhCZi8zsfW.html

Copy link
Contributor

github-actions bot commented Mar 24, 2025

Test Results

 50 files   -    984   50 suites   - 984   1m 14s ⏱️ - 33m 13s
 76 tests  -  5 798   76 ✅  -  5 775  0 💤  - 22  0 ❌  - 1 
168 runs   - 11 643  168 ✅  - 11 598  0 💤  - 44  0 ❌  - 1 

Results for commit 42824aa. ± Comparison against base commit a362e45.

This pull request removes 5798 tests.
com.google.android.datatransport.cct.CctBackendFactoryTest ‑ create_returnCCTBackend_WhenBackendNameIsCCT
com.google.android.datatransport.cct.CctDestinationTest ‑ cctDestination_shouldOnlySupportProtoAndJson
com.google.android.datatransport.cct.CctDestinationTest ‑ cctDestination_shouldSupportProtoAndJson
com.google.android.datatransport.cct.CctTransportBackendTest ‑ decorate_whenOffline_shouldProperlyPopulateNetworkInfo
com.google.android.datatransport.cct.CctTransportBackendTest ‑ decorate_whenOnline_shouldProperlyPopulateNetworkInfo
com.google.android.datatransport.cct.CctTransportBackendTest ‑ schedule_shouldAddCookieOnPseudonymousIds
com.google.android.datatransport.cct.CctTransportBackendTest ‑ schedule_shouldDropCookieOnMixedPseudonymousIds
com.google.android.datatransport.cct.CctTransportBackendTest ‑ send_CompressedResponseIsUncompressed
com.google.android.datatransport.cct.CctTransportBackendTest ‑ send_whenBackendRedirectsMoreThan5Times_shouldOnlyRedirect4Times
com.google.android.datatransport.cct.CctTransportBackendTest ‑ send_whenBackendRedirects_shouldCorrectlyFollowTheRedirectViaPost
…

♻️ This comment has been updated with latest results.

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Mar 24, 2025

Size Report 1

Affected Products

  • firebase-common

    TypeBase (70c8e89)Merge (18bd2ee)Diff
    aar116 kB134 kB+17.9 kB (+15.4%)
    apk (aggressive)140 kB189 kB+49.2 kB (+35.1%)
    apk (release)4.45 MB5.91 MB+1.46 MB (+32.8%)

Test Logs

  1. https://storage.googleapis.com/firebase-sdk-metric-reports/otUsky0FOI.html

@google-oss-bot
Copy link
Contributor

google-oss-bot commented Mar 27, 2025

Startup Time Report 1

Note: Layout is sometimes suboptimal due to limited formatting support on GitHub. Please check this report on GCS.

Notes

Startup Times

  • ComponentDiscovery

    DeviceStatisticsDistributions
    oriole-32
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p10493 ±17 μs484 ±10 μs-9.04 μs (-1.8%)NO
    p25541 ±24 μs546 ±23 μs+4.80 μs (+0.9%)NO
    p50647 ±17 μs637 ±18 μs-10.1 μs (-1.6%)NO
    p75784 ±50 μs777 ±39 μs-6.70 μs (-0.9%)NO
    p90975 ±86 μs972 ±81 μs-3.38 μs (-0.3%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
    redfin-30
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p10788 ±19 μs799 ±17 μs+10.3 μs (+1.3%)NO
    p25823 ±18 μs834 ±15 μs+10.9 μs (+1.3%)NO
    p50895 ±26 μs904 ±31 μs+8.49 μs (+0.9%)NO
    p751.14 ±0.09 ms1.13 ±0.1 ms-19.0 μs (-1.7%)NO
    p901.60 ±0.2 ms1.56 ±0.1 ms-42.2 μs (-2.6%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
  • Firebase

    DeviceStatisticsDistributions
    oriole-32
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p105.65 ±0.1 ms5.58 ±0.1 ms-72.4 μs (-1.3%)NO
    p255.95 ±0.1 ms5.81 ±0.1 ms-140 μs (-2.4%)NO
    p506.43 ±0.2 ms6.27 ±0.1 ms-164 μs (-2.5%)NO
    p757.05 ±0.2 ms6.89 ±0.2 ms-160 μs (-2.3%)NO
    p907.73 ±0.3 ms7.65 ±0.3 ms-76.1 μs (-1.0%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
    redfin-30
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p108.16 ±0.2 ms8.35 ±0.2 ms+190 μs (+2.3%)NO
    p258.43 ±0.3 ms8.61 ±0.3 ms+184 μs (+2.2%)NO
    p508.87 ±0.3 ms9.05 ±0.2 ms+174 μs (+2.0%)NO
    p759.62 ±0.4 ms9.84 ±0.4 ms+220 μs (+2.3%)NO
    p9010.9 ±0.6 ms11.3 ±0.6 ms+384 μs (+3.5%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
  • Runtime

    DeviceStatisticsDistributions
    oriole-32
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p105.05 ±0.1 ms4.97 ±0.1 ms-77.9 μs (-1.5%)NO
    p255.28 ±0.1 ms5.16 ±0.1 ms-115 μs (-2.2%)NO
    p505.68 ±0.1 ms5.51 ±0.09 ms-169 μs (-3.0%)NO
    p756.25 ±0.2 ms6.08 ±0.2 ms-169 μs (-2.7%)NO
    p906.89 ±0.2 ms6.85 ±0.3 ms-32.9 μs (-0.5%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
    redfin-30
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p107.22 ±0.2 ms7.39 ±0.2 ms+170 μs (+2.4%)NO
    p257.44 ±0.2 ms7.60 ±0.2 ms+159 μs (+2.1%)NO
    p507.78 ±0.2 ms7.96 ±0.2 ms+173 μs (+2.2%)NO
    p758.27 ±0.3 ms8.53 ±0.3 ms+258 μs (+3.1%)NO
    p909.09 ±0.4 ms9.49 ±0.5 ms+396 μs (+4.4%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
  • timeToInitialDisplay

    DeviceStatisticsDistributions
    oriole-32
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p10197 ±5 ms202 ±3 ms+4.12 ms (+2.1%)NO
    p25204 ±5 ms207 ±3 ms+3.39 ms (+1.7%)NO
    p50210 ±5 ms213 ±4 ms+2.93 ms (+1.4%)NO
    p75218 ±5 ms221 ±4 ms+3.05 ms (+1.4%)NO
    p90225 ±6 ms232 ±7 ms+7.10 ms (+3.2%)NO

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG
    redfin-30
    Percentile70c8e8918bd2eeDiffSignificant (?)
    p10224 ±2 ms246 ±8 ms+22.6 ms (+10.1%)MAYBE
    p25230 ±2 ms253 ±8 ms+23.8 ms (+10.4%)MAYBE
    p50237 ±2 ms261 ±8 ms+24.2 ms (+10.2%)MAYBE
    p75245 ±2 ms270 ±7 ms+25.4 ms (+10.4%)MAYBE
    p90253 ±3 ms281 ±7 ms+27.3 ms (+10.8%)MAYBE

    20 test runs in comparison
    CommitTest Runs
    70c8e89
    • 2025-04-10_19:43:20.185599_ofvb
    • 2025-04-10_19:43:20.185631_CbkX
    • 2025-04-10_19:43:20.185644_xSdJ
    • 2025-04-10_19:43:20.185652_ahSU
    • 2025-04-10_19:43:20.185660_MelI
    • 2025-04-10_19:43:20.185668_rsTl
    • 2025-04-10_19:43:20.185675_pBds
    • 2025-04-10_19:43:20.185681_WXCN
    • 2025-04-10_19:43:20.185688_WkbI
    • 2025-04-10_19:43:20.185694_Yvhm
    18bd2ee
    • 2025-04-10_21:18:25.805123_mbpX
    • 2025-04-10_21:18:25.805158_FwlN
    • 2025-04-10_21:18:25.805169_xyfN
    • 2025-04-10_21:18:25.805177_kiAs
    • 2025-04-10_21:18:25.805186_CqLB
    • 2025-04-10_21:18:25.805194_sVKR
    • 2025-04-10_21:18:25.805202_IrMn
    • 2025-04-10_21:18:25.805208_vbFR
    • 2025-04-10_21:18:25.805214_EutT
    • 2025-04-10_21:18:25.805221_XzXG

  1. https://storage.googleapis.com/firebase-sdk-metric-reports/fX8PTGwkdT/index.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants