aboutsummaryrefslogtreecommitdiff
path: root/java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java')
-rw-r--r--java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java79
1 files changed, 79 insertions, 0 deletions
diff --git a/java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java b/java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java
new file mode 100644
index 000000000..835015900
--- /dev/null
+++ b/java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2023 The Dagger Authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dagger.hilt.android.internal.managers;
+
+import static dagger.hilt.internal.Preconditions.checkNotNull;
+import static dagger.hilt.internal.Preconditions.checkState;
+
+import android.os.Bundle;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.SavedStateHandle;
+import androidx.lifecycle.SavedStateHandleSupport;
+import androidx.lifecycle.viewmodel.CreationExtras;
+import androidx.lifecycle.viewmodel.MutableCreationExtras;
+import dagger.hilt.android.internal.ThreadUtil;
+
+/** Implementation for SavedStateHandleHolder. */
+public final class SavedStateHandleHolder {
+ private CreationExtras extras;
+ private SavedStateHandle handle;
+ private final boolean nonComponentActivity;
+
+ SavedStateHandleHolder(@Nullable CreationExtras extras) {
+ nonComponentActivity = (extras == null);
+ this.extras = extras;
+ }
+
+ SavedStateHandle getSavedStateHandle() {
+ ThreadUtil.ensureMainThread();
+ checkState(
+ !nonComponentActivity,
+ "Activity that does not extend ComponentActivity cannot use SavedStateHandle");
+ if (handle != null) {
+ return handle;
+ }
+ checkNotNull(
+ extras,
+ "The first access to SavedStateHandle should happen between super.onCreate() and"
+ + " super.onDestroy()");
+ // Clean up default args, since those are unused and we don't want to duplicate those for each
+ // SavedStateHandle
+ MutableCreationExtras mutableExtras = new MutableCreationExtras(extras);
+ mutableExtras.set(SavedStateHandleSupport.DEFAULT_ARGS_KEY, Bundle.EMPTY);
+ extras = mutableExtras;
+ handle = SavedStateHandleSupport.createSavedStateHandle(extras);
+
+ extras = null;
+ return handle;
+ }
+
+ public void clear() {
+ extras = null;
+ }
+
+ public void setExtras(CreationExtras extras) {
+ if (handle != null) {
+ // If handle is already created, we don't need to store CreationExtras.
+ return;
+ }
+ this.extras = extras;
+ }
+
+ public boolean isInvalid() {
+ return handle == null && extras == null;
+ }
+}