diff options
Diffstat (limited to 'java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java')
-rw-r--r-- | java/dagger/hilt/android/internal/managers/SavedStateHandleHolder.java | 79 |
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; + } +} |