blob: 620794e97b0a1b05e2e2c7a1232384f014858427 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.embedding.engine;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import java.util.HashMap;
import java.util.Map;
/**
* Static singleton cache that holds {@link io.flutter.embedding.engine.FlutterEngineGroup}
* instances identified by {@code String}s.
*
* <p>The ID of a given {@link io.flutter.embedding.engine.FlutterEngineGroup} can be whatever
* {@code String} is desired.
*
* <p>{@link io.flutter.embedding.android.FlutterActivity} and {@link
* io.flutter.embedding.android.FlutterFragment} use the {@code FlutterEngineGroupCache} singleton
* internally when instructed to use a cached {@link io.flutter.embedding.engine.FlutterEngineGroup}
* based on a given ID. See {@link
* io.flutter.embedding.android.FlutterActivity.NewEngineInGroupIntentBuilder} and {@link
* io.flutter.embedding.android.FlutterFragment#withNewEngineInGroup(String)} for related APIs.
*/
public class FlutterEngineGroupCache {
private static volatile FlutterEngineGroupCache instance;
/**
* Returns the static singleton instance of {@code FlutterEngineGroupCache}.
*
* <p>Creates a new instance if one does not yet exist.
*/
@NonNull
public static FlutterEngineGroupCache getInstance() {
if (instance == null) {
synchronized (FlutterEngineGroupCache.class) {
if (instance == null) {
instance = new FlutterEngineGroupCache();
}
}
}
return instance;
}
private final Map<String, FlutterEngineGroup> cachedEngineGroups = new HashMap<>();
@VisibleForTesting
/* package */ FlutterEngineGroupCache() {}
/**
* Returns {@code true} if a {@link io.flutter.embedding.engine.FlutterEngineGroup} in this cache
* is associated with the given {@code engineGroupId}.
*/
public boolean contains(@NonNull String engineGroupId) {
return cachedEngineGroups.containsKey(engineGroupId);
}
/**
* Returns the {@link io.flutter.embedding.engine.FlutterEngineGroup} in this cache that is
* associated with the given {@code engineGroupId}, or {@code null} is no such {@link
* io.flutter.embedding.engine.FlutterEngineGroup} exists.
*/
@Nullable
public FlutterEngineGroup get(@NonNull String engineGroupId) {
return cachedEngineGroups.get(engineGroupId);
}
/**
* Places the given {@link io.flutter.embedding.engine.FlutterEngineGroup} in this cache and
* associates it with the given {@code engineGroupId}.
*
* <p>If a {@link io.flutter.embedding.engine.FlutterEngineGroup} is null, that {@link
* io.flutter.embedding.engine.FlutterEngineGroup} is removed from this cache.
*/
public void put(@NonNull String engineGroupId, @Nullable FlutterEngineGroup engineGroup) {
if (engineGroup != null) {
cachedEngineGroups.put(engineGroupId, engineGroup);
} else {
cachedEngineGroups.remove(engineGroupId);
}
}
/**
* Removes any {@link io.flutter.embedding.engine.FlutterEngineGroup} that is currently in the
* cache that is identified by the given {@code engineGroupId}.
*/
public void remove(@NonNull String engineGroupId) {
put(engineGroupId, null);
}
/**
* Removes all {@link io.flutter.embedding.engine.FlutterEngineGroup}'s that are currently in the
* cache.
*/
public void clear() {
cachedEngineGroups.clear();
}
}